Autore Topic: Stoppare un activity e riattivare quella che la ha attivata  (Letto 2716 volte)

Offline jocker99

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy mini 2
  • Sistema operativo:
    debian 6 - 64 bit
Stoppare un activity e riattivare quella che la ha attivata
« il: 16 Agosto 2012, 10:05:29 CEST »
0
salve ragazzi, grazie mille per i vostri esempi e aiuti.
 volevo chiedervi un aiuto dato che mi sto' incartando e non riesco ad uscirne :(
allora dal mio layout principale ho tre bottoni e una listview, quando clicco il bottone 1 parte un fragment che mi popola e mi fà visualizzare la listview, ma non so' come fare a rendere attiva la activity principale dato che quando clicco i bottoni 2 e 3 non succede niente (all'interno scrivo solo nel file di log)
da quello che ho letto in giro, aumentando esponenzialmente la mia confusione, dovrei implementare il metodo onResume() nel fragment ma non so' come devo fare a  attivare activity facendo restare visibile la listview, tenete presente che la list view non implementa nessuna interazione  con l'utente e sola una lista che deve essere visualizzata

per completezza e chiarimento vi allego il codice sorgente,
Main.java
Codice (Java): [Seleziona]
public class MainActivity extends FragmentActivity {

        private static final String FRAG1_TAG = MainActivity.class.getCanonicalName() + ".fragment1";

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                /** Bottone aggiorna */
                Button buttonAggiorna = (Button) findViewById(R.id.buttonAggiorna);
                buttonAggiorna.setOnClickListener(new OnClickListener() {

                        public void onClick(View arg0) {
                                Log.i("exemple", "start button Start !!!!!!");
                                lanciaFrammento();
                               

                        }// fine onClick


                });// fine onClickListner
               
                /** Bottone aggiorna */
                Button buttonAllarm = (Button) findViewById(R.id.buttonAllarm);
                buttonAllarm.setOnClickListener(new OnClickListener() {
                        public void onClick(View arg0) {
                                AppLog.logString("Parte ALLARME !!!!!!!!!!!!!");
                                Log.i("exemple", "start button allarm !!!!!!");
                        }// fine onClick
                });// fine onClickListner      
        }

        void lanciaFrammento() {

                FragmentManager fm = getSupportFragmentManager();
                // FRAGMENTION PER VERSIONI API LEVEL MINORI DELLA 11
                FragmentTransaction xact = fm.beginTransaction();
                if (null == fm.findFragmentByTag(FRAG1_TAG)) {
                        xact.replace(android.R.id.content, new ListaFramment(), FRAG1_TAG);
                         xact.addToBackStack (null);  
                                xact.commit();
                }      
        }
}
   

di seguito il frammento, listaFramment.java

Codice (Java): [Seleziona]
public class ListaFramment extends ListFragment {

         // onCreate
           @Override
           public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
           }

           @Override
           public void onResume() {
                super.onResume();
           }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                View view = inflater.inflate(R.layout.activity_main, null);
                AppLog.logString("Parte onCreateView");
                return view;
        }      
       
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
                super.onActivityCreated(savedInstanceState);
                AppLog.logString("Parte onActivityCreated");

                ArrayList<Map<String, String>> list = buildData();
                list = buildData();
               
                String[] from = { "name", "purpose" };
                int[] to = { android.R.id.text1, android.R.id.text2 };
                SimpleAdapter adapter = new SimpleAdapter(getActivity(), list,
                android.R.layout.simple_list_item_2, from, to);
                setListAdapter(adapter);
        }

        private ArrayList<Map<String, String>> buildData() {
                ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
                list.add(putData("Data inizio: 01-10-2012 Settore: APPALTI SETTORE FERROVIARIO","modalità: un turno dalle 21.00 dell\' 1/10 alle 20.59 del 2/10 personale addetto alle attivita\' complementari e di supporto al servizio ferroviario data fine: 02-10-2012"));
                list.add(putData("Windows7", "Windows7"));
                list.add(putData("iPhone", "iPhone"));
                return list;
                // TODO Auto-generated method stub
               
        }
       
        private HashMap<String, String> putData(String name, String purpose) {
                HashMap<String, String> item = new HashMap<String, String>();
                item.put("name", name);
                item.put("purpose", purpose);
                return item;
        }
       
       
}

grazie mille
j.
« Ultima modifica: 16 Agosto 2012, 10:07:34 CEST da jocker99 »

Offline emaborsa

  • Utente normale
  • ***
  • Post: 274
  • Java Developer
  • Respect: +33
    • Google+
    • emaborsa
    • Mostra profilo
    • www.emaborsa.com
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Linux 10 - Win8.1 - Android 4.1.2
Re:Stoppare un activity e riattivare quella che la ha attivata
« Risposta #1 il: 21 Agosto 2012, 10:57:25 CEST »
0
Se devo essere sincero, non ho capito bene. Nel titolo parli di activity, ma nella descrizione parli solo die view...e nel codice non trovo nemmeno l'avvio di una nuova activity. Da quello che ho capito vuoi avere una MainActivity con dei bottoni, cliccando uno di questi si apre un altra activity con la tua lista.
IO personalmente creerei una semplice Activity con i suddetti bottoni, poi creerei una seconda activity (puoi usare una ListActivity) che implementa solo una listview. Fatto questo, al click del bottono basta fare un startActivity(new Intent(this, NOMESECONDAACTIVITY.class)); così una volta che chiudi la seconda, riappare la prima. Inoltre non ti serve nessun onresume() o altri, a parte onCreate().

Offline Pecas

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung GS2
Re:Stoppare un activity e riattivare quella che la ha attivata
« Risposta #2 il: 22 Agosto 2012, 15:36:11 CEST »
0
Scusate se mi aggiungo ma anche io ho lo stesso problema.

Nel mio caso ho un'activity. Sull'evento onCreate faccio il test della login. Se l'utente non è collegato vorrei chiudere questa attivity, aprire l'activity della login e la rispettiva view ed effettuare il login(festo funziona). Appena terminato vorrei terminare l'activity della login che non serve più e riaprire l'activity che l'ha chiamata facendo riscattare l'evento onCreate, se possibile. Il fatto che dal programma una qualsiasi activity potrebbe richiamare la'activity di login. percui come faccio a sapere dove tornare?

Grazie!

Aggiornamento:
Ho cercato 1 ora come fare e poi era una cavolata. Basta mettere il comando
Codice (Java): [Seleziona]
finish(); alla fine delle istruzioni e l'activity si chiude riaprendo la chiamante :)
« Ultima modifica: 22 Agosto 2012, 15:46:13 CEST da Pecas »

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:Stoppare un activity e riattivare quella che la ha attivata
« Risposta #3 il: 22 Agosto 2012, 20:47:31 CEST »
0
Scusate se mi aggiungo ma anche io ho lo stesso problema.

Nel mio caso ho un'activity. Sull'evento onCreate faccio il test della login. Se l'utente non è collegato vorrei chiudere questa attivity, aprire l'activity della login e la rispettiva view ed effettuare il login(festo funziona). Appena terminato vorrei terminare l'activity della login che non serve più e riaprire l'activity che l'ha chiamata facendo riscattare l'evento onCreate, se possibile. Il fatto che dal programma una qualsiasi activity potrebbe richiamare la'activity di login. percui come faccio a sapere dove tornare?

Grazie!

Aggiornamento:
Ho cercato 1 ora come fare e poi era una cavolata. Basta mettere il comando
Codice (Java): [Seleziona]
finish(); alla fine delle istruzioni e l'activity si chiude riaprendo la chiamante :)


Non riapre la chiamante.. anzi.. riapre la chiamante solo se è ancora in memoria. su telefoni con poca ram o con molte app aperte, l'activity potrebbe essere stata chiusa e quindi ritorni alla home. Per evitare questo, oltre a chiamare finish() crea un intent che apre l'activity precedente. Ovviamente il finish() va dopo aver lanciato l'intent :)
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline Pecas

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung GS2
Re:Stoppare un activity e riattivare quella che la ha attivata
« Risposta #4 il: 23 Agosto 2012, 00:47:04 CEST »
0
Meglio. Io voglio che la chiuda xche occupa ram inutile ma vorreitenere solo a mente il nome per richiamarla. Anche xchè ho delle cose impostate sull'event onCreate che dopo il login deve ri-eseguire. Ma come faccio a salvareil nome dell'activiry e passarla alla nuova activity x farla rigenerare?

Grazie!

Offline emaborsa

  • Utente normale
  • ***
  • Post: 274
  • Java Developer
  • Respect: +33
    • Google+
    • emaborsa
    • Mostra profilo
    • www.emaborsa.com
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Linux 10 - Win8.1 - Android 4.1.2
Re:Stoppare un activity e riattivare quella che la ha attivata
« Risposta #5 il: 23 Agosto 2012, 08:26:51 CEST »
0
Ma come faccio a salvareil nome dell'activiry e passarla alla nuova activity x farla rigenerare?

Estendi la classe Application e metti una variabile per tenere "mente" dell'activity chiusa/ da aprire; facendoci il getter e setter dovresti essere in grado. SE lo fai, ricordati di inserire la tua classe application estesa nel manifest.

Offline Pecas

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung GS2
Re:Stoppare un activity e riattivare quella che la ha attivata
« Risposta #6 il: 23 Agosto 2012, 08:48:08 CEST »
0
Estendi la classe Application e metti una variabile per tenere "mente" dell'activity chiusa/ da aprire; facendoci il getter e setter dovresti essere in grado. SE lo fai, ricordati di inserire la tua classe application estesa nel manifest.
Uff avevo già provato a fare una cosa simile per le funzioni condivise tra + activity ma quando lo faccio, la activity si chiude generando un errore.  :-(
Appena ho sotto mano il codice lo posto per conferma.

Eccolo:
gblFunctions extends Application
Codice (Java): [Seleziona]
package intra.android;

import android.app.Activity;
import android.app.Application;

public class gblFunctions extends Application {
        protected Activity pActivity;
       
        public Activity getpActivityValue() {
        return pActivity;
    }
 
    public void setpActivityValue(Activity value) {
        pActivity = value;
    }
       
    public boolean isLogin() {
                String response = false;
        try {
            return true;
        } catch (Exception e) {
                return false;
        }
        }      
}

Nel Manifest.xml
Codice (Java): [Seleziona]
<application>
....
</application>
<application
               android:name="intra.android.gblFunctions"
               android:icon="@drawable/ic_launcher"
               android:label="@string/app_name" />
Setto la Activity:
Codice (Java): [Seleziona]
gblFunctions pActivity = null;
                                Intent iActivity = null;
                                                if (pActivity.getpActivityValue()!=null) {
                                                        iActivity = new Intent(v.getContext(), pActivity.getpActivityValue().getClass());
                                                }else{
                                                        iActivity = new Intent(v.getContext(), MainActivity.class);
                                                }
                                startActivityForResult(iActivity, 0);
                                finish();

Ma appena richiamo l'Activity mi genera errore :
Codice: [Seleziona]
08-22 19:52:02.586: W/dalvikvm(2026): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
08-22 19:52:02.627: E/AndroidRuntime(2026): FATAL EXCEPTION: main
08-22 19:52:02.627: E/AndroidRuntime(2026): java.lang.NullPointerException
08-22 19:52:02.627: E/AndroidRuntime(2026):         at intra.android.MainActivity$1.onItemClick(MainActivity.java:64)
08-22 19:52:02.627: E/AndroidRuntime(2026):         at android.widget.AdapterView.performItemClick(AdapterView.java:298)
08-22 19:52:02.627: E/AndroidRuntime(2026):         at android.widget.AbsListView.performItemClick(AbsListView.java:1086)
08-22 19:52:02.627: E/AndroidRuntime(2026):         at android.widget.AbsListView$PerformClick.run(AbsListView.java:2855)
08-22 19:52:02.627: E/AndroidRuntime(2026):         at android.widget.AbsListView$1.run(AbsListView.java:3529)
08-22 19:52:02.627: E/AndroidRuntime(2026):         at android.os.Handler.handleCallback(Handler.java:615)
08-22 19:52:02.627: E/AndroidRuntime(2026):         at android.os.Handler.dispatchMessage(Handler.java:92)
08-22 19:52:02.627: E/AndroidRuntime(2026):         at android.os.Looper.loop(Looper.java:137)
08-22 19:52:02.627: E/AndroidRuntime(2026):         at android.app.ActivityThread.main(ActivityThread.java:4745)
08-22 19:52:02.627: E/AndroidRuntime(2026):         at java.lang.reflect.Method.invokeNative(Native Method)
08-22 19:52:02.627: E/AndroidRuntime(2026):         at java.lang.reflect.Method.invoke(Method.java:511)
08-22 19:52:02.627: E/AndroidRuntime(2026):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-22 19:52:02.627: E/AndroidRuntime(2026):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-22 19:52:02.627: E/AndroidRuntime(2026):         at dalvik.system.NativeStart.main(Native Method)

RISOLTO:
Ho modificato la GET e la SET per ricevere un Intent. Per l'errore avevo dimenticato d'inserire la riga
Codice (Java): [Seleziona]
pActivity = (gblFunctions) getApplication();
« Ultima modifica: 23 Agosto 2012, 11:39:25 CEST da Pecas, Reason: Risolto! »

Offline Pecas

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung GS2
Re:Stoppare un activity e riattivare quella che la ha attivata
« Risposta #7 il: 24 Agosto 2012, 11:28:41 CEST »
0
Ma esiste un modo per rendere la classe veramente globale istanziandola una volta nel Main e poi poterla richiamare ogvunque senza doverla reistanziare ogni volta? Come avviene per R o per altri oggetti.

Anche perchè sto avendo problemi nelle Classi personali che non hanno un'activity e ho problemi ad istanziare il Context o mContext...

Grazie!

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Stoppare un activity e riattivare quella che la ha attivata
« Risposta #8 il: 24 Agosto 2012, 12:20:41 CEST »
0
Ma esiste un modo per rendere la classe veramente globale istanziandola una volta nel Main e poi poterla richiamare ogvunque senza doverla reistanziare ogni volta? Come avviene per R o per altri oggetti.

In pratica non esiste un Main, ogni activity è indipendente. Solitamente si sente la necessità di variabili globali quando si ha bisogno di salvare un qualche stato o dato attraverso più activity. Il linguaggio java ci suggerisce le variabili statiche (vedi Singleton), ma un modo più elegante che si integra con il framework android è l'estensione della classe Application (come sopra hai fatto), che poi fa uso esa stessa di variabili statiche.

Non sono a conoscenza di modi migliori.

Un consiglio che vale in generale, a livello di linguaggio di programmazione, è quello di ridurre al minimo le variabili globali, perchè se all'inizio semplificano molto la vita, poi creano molte complicazioni. Per esempio le tue classi diventano dipendenti dal codice esterno alla classe stessa, si perde facilmente il controllo del codice che accedere alle variabili globali, non sono thread-safe.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline emaborsa

  • Utente normale
  • ***
  • Post: 274
  • Java Developer
  • Respect: +33
    • Google+
    • emaborsa
    • Mostra profilo
    • www.emaborsa.com
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Linux 10 - Win8.1 - Android 4.1.2
Re:Stoppare un activity e riattivare quella che la ha attivata
« Risposta #9 il: 24 Agosto 2012, 12:46:01 CEST »
0
Ma esiste un modo per rendere la classe veramente globale istanziandola una volta nel Main e poi poterla richiamare ogvunque senza doverla reistanziare ogni volta? Come avviene per R o per altri oggetti.

Anche perchè sto avendo problemi nelle Classi personali che non hanno un'activity e ho problemi ad istanziare il Context o mContext...

Grazie!

...come già detto prima, io usereri la Application estendendola.

Offline Pecas

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung GS2
Re:Stoppare un activity e riattivare quella che la ha attivata
« Risposta #10 il: 24 Agosto 2012, 12:51:41 CEST »
0
No in realtà a me serve una cosa + semplice e forse sto pensando male.

Ho creato una classe tutta mia dove vorrei mettere tutte le funzioni e richiamarle in caso di necessità all'interno della mia Applicazione senza dover riscrivere molte volte la medesima classe (prassi classica).

Ora io ho pensato di mettere tutte le mie funzioni e void all'interno della classe che estende l'Application. Però ci sono delle classi, come httpclient, a se stanti da cui non riesco a richiamare la classe Estesa perchè non riesco a stanziare il Content per richiamare la mia funzione.

Come risolvo?

Nelle classi il:
Codice (Java): [Seleziona]
pActivity = (gblFunctions) getApplication(); Non funziona.
« Ultima modifica: 24 Agosto 2012, 12:53:38 CEST da Pecas »

Offline DarnellNajanReed

  • Utente normale
  • ***
  • Post: 359
  • Respect: +49
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One, Acer Iconia A500/501, Asus Transformer Prime, Galaxy ACE, Galaxy S Plus, Galaxy S Advance P, Galaxy Tab 2 7.0, Google Nexus 7
  • Play Store ID:
    Luigi Notaro
  • Sistema operativo:
    OS X 10.8.3
Re:Stoppare un activity e riattivare quella che la ha attivata
« Risposta #11 il: 24 Agosto 2012, 17:03:21 CEST »
0
Citazione
Nelle classi il:
Codice (Java): [Seleziona]
pActivity = (gblFunctions) getApplication();
Non funziona.
Mi stupirei del contrario. La tua classe implementa forse un metodo getApplication()? No...

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Stoppare un activity e riattivare quella che la ha attivata
« Risposta #12 il: 24 Agosto 2012, 18:01:03 CEST »
0
Ho creato una classe tutta mia dove vorrei mettere tutte le funzioni e richiamarle in caso di necessità all'interno della mia Applicazione senza dover riscrivere molte volte la medesima classe (prassi classica).

Aspetta. Effettivamente è una cosa completamente diversa. E non c'entra niente android, si tratta semplicemente di java.

Se è effettivamente questa la domanda, allora una soluzione abbastanza semplice è: creati la tua classe esempio Toolbox.java e all'interno definisci le funzioni come statiche (così non dovrai istanziarne nessuna per poterle usare), esempio:

Codice (Java): [Seleziona]
class Toolbox {
   public static int somma (int a, int b) { return a+b; }
}

Quindi in una qualsiasi classe puoi sempre usarla così:

Codice (Java): [Seleziona]
   int mele = 2;
   int pere = 3;
   int totale = Toolbox.somma(mele+pere);
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline emaborsa

  • Utente normale
  • ***
  • Post: 274
  • Java Developer
  • Respect: +33
    • Google+
    • emaborsa
    • Mostra profilo
    • www.emaborsa.com
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Linux 10 - Win8.1 - Android 4.1.2
Re:Stoppare un activity e riattivare quella che la ha attivata
« Risposta #13 il: 25 Agosto 2012, 13:35:07 CEST »
0
Mi stupirei del contrario. La tua classe implementa forse un metodo getApplication()? No...

Volevo solo precisare...getApplication() è richiamabile da quasiasi activity. Non c'è mica bisogno di definirla da qualche parte.

Offline jocker99

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy mini 2
  • Sistema operativo:
    debian 6 - 64 bit
Re:Stoppare un activity e riattivare quella che la ha attivata
« Risposta #14 il: 28 Agosto 2012, 17:31:37 CEST »
0
allora dopo un po' di tempo e con molte imprecazione ho scoperto che usando i fragment quello che chiedevo di fare non e' consigliato..... in pratica i fragment conviene usarli se uno deve implementare app per tablet o su schermi differenti, ma tenendo presente che una volta attivato il fragment per passare i dati alla Ui si deve usare una classe parcellable, in parole povere se ti serve  di modificare l'intera UI(adattandola allo schermo o altro...) va bene il fragment altrimenti usi asynchtask ,
grazie a tutti
j.