Pulsante Android Actionbar Su verso il button di sistema Back
Sto utilizzando la barra di azione e il button "su" per tornare da un'attività di dettaglio all'attività principale, che funziona bene. Allo stesso modo, l'utente può premere il button "back" del sistema per tornare all'attività principale.
Nella mia attività principale, i dati onCreate()
vengono scaricati da internet per visualizzare l'avvio dell'app. Ho notato che quando utilizzo il button "up" di Actionbar per passare da un dettaglio all'attività principale, viene eseguito onCreate()
, re-download dei dati. Ma onCreate()
non viene eseguito quando utilizzo il button "back" del sistema, quindi mostrando immediatamente la vista attività principale.
Il codice che utilizzo nell'attività di dettaglio per implementare il button "su" è:
switch (item.getItemId()) { case android.R.id.home: Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); return true;
Vorrei che il button "su" si comporti come il button "indietro" e non onCreate()
. Ma non sono sicuro di come fare questo accadere, o quale codice di path il button "indietro" attua per tornare all'attività principale.
Grazie!
6 Solutions collect form web for “Pulsante Android Actionbar Su verso il button di sistema Back”
Invece di avviare una nuova attività, finisci semplicemente l'attività di dettaglio in cui sei in corso
switch (item.getItemId()) { case android.R.id.home: finish(); return true;
Quindi tornerai all'attività precedente nello stack di attività (la tua attività principale) e non dovrai call Crea
Penso che una soluzione migliore possa essere trovata in questo post .
La chiamata finish()
funziona in situazioni specifiche, ma non sempre può produrre il comportmento descritto nella documentazione, ad esempio:
Chiamando
Intent intent = NavUtils.getParentActivityIntent(this); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); NavUtils.navigateUpTo(this, intent);
torni all'attività del padre nello stato in cui lo hai lasciato. Se hai una struttura app piatta, agirà comunque come il button Indietro.
Se vuoi fare esattamente quello che fa Back, puoi farlo:
@Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case android.R.id.home: onBackPressed(); return true; default: break; } return super.onOptionsItemSelected(item); }
Si noti che l'implementazione predefinita di onBackPressed()
chiama solo finish()
, ma onBackPressed
può essere sovrascritto.
Credo che il modo più semplice sia quello di ignorare il metodo "getParentActivityIntent" dell'attività di dettaglio aggiungendo la bandiera "Intent.FLAG_ACTIVITY_CLEAR_TOP":
@Nullable @Override public Intent getParentActivityIntent() { Intent intent = super.getParentActivityIntent(); if (intent != null) { return super.getParentActivityIntent().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); } return intent; }
per una reale "home" funzionalità, dovresti vedere le demo api, in "Attività app / attività / riordino".
il motivo: cosa succede se hai qualcosa di simile: activity1-> activity2-> activity3, e ora vuoi andare all'attività1 premendo il button Home sulla barra di azione?
C'è un'altra soluzione che può essere in mano per qualcuno. Ho avuto lo stesso doppio comportmento quando l'utente ha premuto i pulsanti Back e ActionbarBack. Sono andato bene con il comportmento di Back btn. Non volevo che un'attività venisse ricreata. Così ho superato il metodo
@Override public boolean onSupportNavigateUp() { onBackPressed(); return true; }
Funziona bene per me