Pulsante Indietro e aggiornamento dell'attività precedente


85

Se abbiamo due attività:

  1. Elenco dei file e ora dell'ultima modifica
  2. Attività di modifica dei file

Un utente seleziona un file dall'elenco e viene indirizzato all'attività di modifica del file. Al termine della modifica, l'utente preme il pulsante Indietro per tornare all'elenco dei file.

L'elenco non viene ricaricato e quindi viene visualizzato un valore errato per l'ora di modifica dei file appena modificati.

Qual è il metodo corretto per aggiornare l'elenco dei file dopo aver premuto il pulsante Indietro?

In questo esempio si presume che non venga utilizzato alcun database, ma solo un ArrayAdapter.


1
onRestart () dovrebbe funzionare meglio. onResume () verrà chiamato due volte e onRestart () verrà chiamato solo quando si preme il pulsante Indietro.
Sarah Sakamoto

Risposte:


108

Un'opzione potrebbe essere quella di utilizzare onResume della tua prima attività.

@Override
public void onResume()
    {  // After a pause OR at startup
    super.onResume();
    //Refresh your stuff here
     }

Oppure puoi avviare l'attività per il risultato:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

In secondActivity se desideri restituire i dati:

 Intent returnIntent = new Intent();
 returnIntent.putExtra("result",result);
 setResult(RESULT_OK,returnIntent);     
 finish();

se non vuoi restituire i dati:

Intent returnIntent = new Intent();
setResult(RESULT_CANCELED, returnIntent);        
finish();

Ora nella tua classe FirstActivity scrivi il seguente codice per il onActivityResult()metodo

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

  if (requestCode == 1) {

     if(resultCode == RESULT_OK){      
         //Update List         
     }
     if (resultCode == RESULT_CANCELED) {    
         //Do nothing?
     }
  }
}//onActivityResult

cosa succede se non voglio terminare l'attività corrente e voglio che l'attività precedente venga aggiornata
Mansuu ....

@Waza_Be onResumenon ha chiamato per me, qualche idea del perché? ( Ho provato onRestarte onPauseanche io , ma nessuno di loro non ha chiamato )
Mehdi Dehghani

Nel mio caso, sono passato all'attività da Frammento. Quindi, quando si torna da Activity a fragment, poiché altre risposte menzionano onRestart () che non è contenuto da Fragment, quindi, questa risposta ha funzionato per me. Per un frammento, puoi usare onResume ().
Feroz Khan

40

Penso che onRestart () funzioni meglio per questo.

@Override
public void onRestart() { 
    super.onRestart();
    //When BACK BUTTON is pressed, the activity on the stack is restarted
    //Do what you want on the refresh procedure here
}

È possibile codificare ciò che si desidera fare quando l'attività viene riavviata (chiamata di nuovo dall'evento "pulsante Indietro premuto") all'interno di onRestart ().

Ad esempio, se vuoi fare la stessa cosa che fai in onCreate (), incolla il codice in onRestart () (es. Ricostruendo l'interfaccia utente con i valori aggiornati).


7
Questo è banale, ma mi hanno dirlo: ovviamente sarebbe meglio spostare il codice onCreate () in un metodo separato che quindi richiamare sia da onCreate (), così come onRestart () al posto di copia incollarlo.
Ricardo van den Broek

Puoi anche usare onCreate () solo per aumentare le visualizzazioni e istanziare variabili globali e usare onStart () per assegnarle / (ri) impostarle. Così il tuo init () (o come vuoi chiamarlo) verrà chiamato ogni volta che inizia l'attività; cioè dopo onCreate () o dopo onRestart ().
jwehrle

Questo è davvero utile se hai bisogno di reinizializzare il ViewModel delle tue attività. Consente di recuperare nuovamente dal database, impostare le variabili di istanza ...
enorme

34

in principale:

@Override
public void onRestart()
{
    super.onRestart();
    finish();
    startActivity(getIntent());
}

Immagino che questo vada all'attività corrente e non all'attività precedente?
Si8

1
Ho avuto lo stesso problema, tranne che il mio era un Frammento, non Attività. Quindi, seguo i consigli qui e ha funzionato: stackoverflow.com/questions/35039512/…
David C.


2

Se vuoi aggiornare l'attività precedente, questa soluzione dovrebbe funzionare:

Nell'attività precedente in cui desideri aggiornare:

@Override
public void onRestart()
{
    super.onRestart();
    // do some stuff here
}

1
private Cursor getAllFavorites() {
    return mDb.query(DocsDsctnContract.DocsDsctnEntry.Description_Table_Name,
            null,
            null,
            null,
            null,
            null,
            DocsDsctnContract.DocsDsctnEntry.COLUMN_Timest);
}
@Override
public void onResume()
{  // After a pause OR at startup
    super.onResume();
    mAdapter.swapCursor(getAllFavorites());
    mAdapter.notifyDataSetChanged();

}

public void swapCursor(Cursor newCursor){
    if (mCursor!=null) mCursor.close();
    mCursor = newCursor;
    if (newCursor != null){
        mAdapter.notifyDataSetChanged();
    }
}

Ho solo la categoria dei preferiti quindi quando faccio clic sull'elemento dai preferiti vengono visualizzate tali informazioni e se non mi piace - questo elemento dovrebbe essere cancellato dai Preferiti: per questo aggiorno il database e lo imposto sull'adattatore (per recyclerview) [Ti auguro capirà il mio problema e la mia soluzione]


considera l'aggiunta di alcune spiegazioni
Gahan

1
 @Override
protected void onRestart() {
    super.onRestart();
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
}

Nell'attività precedente usa questo codice. Questo farà una transizione graduale e ricaricherà l'attività quando torni premendo il pulsante Indietro.


Puoi aggiungere qualche descrizione al codice e grazie per il post.
Nelles

0

Se non gestisco una richiamata dall'attività di modifica (con onActivityResult), preferisco mettere la logica che hai menzionato in onStart (o possibilmente in onRestart), poiché averlo in onResume sembra eccessivo, dato che le modifiche si verificano solo dopo onStop.

In ogni caso, avere familiarità con il ciclo di vita dell'attività . Inoltre, prendi nota dei metodi onRestoreInstanceState e onSaveInstanceState, che non compaiono nel grazioso diagramma del ciclo di vita.

(Inoltre, vale la pena rivedere il modo in cui il Tutorial sul blocco note gestisce ciò che stai facendo, sebbene utilizzi un database.)


0

Il modo migliore per farlo è usare

Intent i = new Intent(this.myActivity, SecondActivity.class); 
startActivityForResult(i, 1);

0

Prova questo

 public void refreshActivity() {
    Intent i = new Intent(this, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
    finish();

}

o in Fragment

  public void refreshActivity() {
    Intent i = new Intent(getActivity(), MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
    finish();

}

E aggiungi questo metodo al tuo onBackPressed () come

  @Override
public void onBackPressed() {      
        refreshActivity();
        super.onBackPressed();
    }
}

Questo è tutto...


0
@Override
public void onBackPressed() {
    Intent intent = new Intent(this,DesiredActivity.class);
    startActivity(intent);
    super.onBackPressed();
}

Questa domanda è vecchia di alcuni anni e la risposta fornita è stata contrassegnata per la revisione come Post di bassa qualità. Ecco alcune linee guida per Come scrivere una buona risposta? . Ci sono altre risposte che forniscono la domanda del PO, e sono state pubblicate qualche tempo fa. Quando pubblichi una risposta, assicurati di aggiungere una nuova soluzione o una spiegazione sostanzialmente migliore, soprattutto quando rispondi a domande meno recenti.
help-info.de
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.