Zurück-Schaltfläche und Aktualisierung der vorherigen Aktivität

84

Wenn wir zwei Aktivitäten haben:

  1. Liste der Dateien und letzte Änderungszeit
  2. Dateibearbeitungsaktivität

Ein Benutzer wählt eine Datei aus der Liste aus und wird zur Dateibearbeitungsaktivität weitergeleitet. Nach Abschluss der Bearbeitung drückt der Benutzer die Zurück-Taste, um zur Dateiliste zurückzukehren.

Die Liste wird nicht neu geladen und daher wird ein falscher Wert für die Änderungszeit der gerade bearbeiteten Dateien angezeigt.

Wie wird die Dateiliste nach dem Drücken der Zurück-Taste ordnungsgemäß aktualisiert?

In diesem Beispiel wird davon ausgegangen, dass keine Datenbank verwendet wird, sondern nur ein ArrayAdapter.

Paul
quelle
1
onRestart () sollte besser funktionieren. onResume () wird zweimal aufgerufen, und onRestart () wird nur aufgerufen, wenn Sie die Zurück-Taste drücken.
Sarah Sakamoto

Antworten:

108

Eine Möglichkeit wäre, den onResume Ihrer ersten Aktivität zu verwenden.

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

Oder Sie können Aktivität für Ergebnis starten:

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

In secondActivity, wenn Sie Daten zurücksenden möchten:

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

Wenn Sie keine Daten zurückgeben möchten:

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

Schreiben Sie nun in Ihrer FirstActivity-Klasse den folgenden Code für die onActivityResult()Methode

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
Waza_Be
quelle
Was ist, wenn ich die aktuelle Aktivität nicht beenden und die vorherige Aktivität aktualisieren
möchte
@Waza_Be onResumenicht für mich angerufen, eine Idee warum? ( Ich habe es versucht onRestartund onPauseauch, aber keiner von ihnen hat nicht angerufen )
Mehdi Dehghani
In meinem Fall bin ich zur Aktivität von Fragment gegangen. Wenn ich also von Aktivität zu Fragment zurückkomme, da andere Antworten onRestart () erwähnen, das nicht in Fragment enthalten ist, hat diese Antwort für mich funktioniert. Für ein Fragment können Sie onResume () verwenden.
Feroz Khan
39

Ich denke, onRestart () funktioniert dafür besser.

@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
}

Sie können in onRestart () codieren, was Sie tun möchten, wenn die Aktivität neu gestartet wird (erneut aufgerufen über die Ereignis-Zurück-Taste).

Wenn Sie beispielsweise dasselbe tun möchten wie in onCreate (), fügen Sie den Code in onRestart () ein (z. B. Rekonstruktion der Benutzeroberfläche mit den aktualisierten Werten).

Sarah Sakamoto
quelle
7
Das ist trivial, aber ich muss es sagen: Natürlich ist es besser, Ihren onCreate () - Code in eine separate Methode zu verschieben, die Sie dann sowohl von onCreate () als auch von onRestart () aus aufrufen, anstatt ihn zu kopieren und einzufügen.
Ricardo van den Broek
Sie können onCreate () auch nur verwenden, um Ansichten aufzublasen und globale Variablen zu instanziieren, und onStart () verwenden, um sie zuzuweisen / (neu) festzulegen. Daher wird Ihr init () (oder wie auch immer Sie es aufrufen möchten) immer dann aufgerufen, wenn die Aktivität beginnt. dh nach onCreate () oder nach onRestart ().
jwehrle
Dies ist sehr nützlich, wenn das ViewModel Ihrer Aktivitäten neu initialisiert werden muss. Lässt es wieder aus der Datenbank
abrufen,
34

in der Hauptsache:

@Override
public void onRestart()
{
    super.onRestart();
    finish();
    startActivity(getIntent());
}
Hamze Shoae
quelle
Ich vermute, dies geht auf die aktuelle Aktivität und nicht auf die vorherige Aktivität?
Si8
1
Ich hatte das gleiche Problem, außer dass es sich bei meinem um ein Fragment handelte, nicht um eine Aktivität. Daher folge ich hier den Ratschlägen und es hat funktioniert: stackoverflow.com/questions/35039512/…
David C.
8

Ich würde empfehlen, die onResume()Methode in Aktivität Nr. 1 zu überschreiben und dort Code zum Aktualisieren Ihres Array-Adapters einzuschließen. Dies erfolgt mithilfe von[yourListViewAdapater].notifyDataSetChanged();

Lesen Sie dies, wenn Sie Probleme beim Aktualisieren der Liste haben: Aktualisierung der Android-Listenansicht

Blindware
quelle
2

Wenn Sie frühere Aktivitäten aktualisieren möchten, sollte diese Lösung funktionieren:

In der vorherigen Aktivität, in der Sie aktualisieren möchten:

@Override
public void onRestart()
{
    super.onRestart();
    // do some stuff here
}
Tô Minh Tiến
quelle
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();
    }
}

Ich habe nur eine Favoriten-Kategorie. Wenn ich also auf das Element aus den Favoriten klicke, werden solche Informationen angezeigt. Wenn ich es nicht mag, sollte dieses Element aus den Favoriten gelöscht werden. Dafür aktualisiere ich die Datenbank und setze sie auf Adapter (für Recycling-Ansicht) werde mein Problem und meine Lösung verstehen]

Aizhan Nessipbayeva
quelle
Erwägen Sie eine Erklärung hinzuzufügen
Gahan
1
 @Override
protected void onRestart() {
    super.onRestart();
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
}

Verwenden Sie in der vorherigen Aktivität diesen Code. Dies führt zu einem reibungslosen Übergang und lädt die Aktivität neu, wenn Sie durch Drücken der Zurück-Taste zurückkehren.

Robiul Hossain Shah Imran
quelle
Können Sie dem Code eine Beschreibung hinzufügen und sich für den Beitrag bedanken?
Nelles
0

Wenn Sie einen Rückruf aus der Bearbeitungsaktivität (mit onActivityResult) nicht bearbeiten, würde ich lieber die Logik verwenden, die Sie in onStart (oder möglicherweise in onRestart) erwähnt haben, da es in onResume nur wie ein Overkill erscheint, da Änderungen erst danach auftreten onStop.

Machen Sie sich auf jeden Fall mit vertraut dem Aktivitätslebenszyklus . Beachten Sie außerdem die Methoden onRestoreInstanceState und onSaveInstanceState, die im hübschen Lebenszyklusdiagramm nicht angezeigt werden.

(Es lohnt sich auch zu überprüfen, wie das Notepad-Lernprogramm mit Ihren Aufgaben umgeht, obwohl eine Datenbank verwendet wird.)

Thane Hymne
quelle
0

Der beste Weg dorthin ist die Verwendung

Intent i = new Intent(this.myActivity, SecondActivity.class); 
startActivityForResult(i, 1);
Flavio Candido
quelle
0

Versuche dies

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

}

oder in Fragment

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

}

Und fügen Sie diese Methode Ihrem onBackPressed () wie hinzu

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

Das ist es...

Rahul
quelle
0
@Override
public void onBackPressed() {
    Intent intent = new Intent(this,DesiredActivity.class);
    startActivity(intent);
    super.onBackPressed();
}
Syed Zaidi
quelle
Diese Frage ist einige Jahre alt und die bereitgestellte Antwort wurde zur Überprüfung als Beitrag von geringer Qualität gekennzeichnet. Hier sind einige Richtlinien für Wie schreibe ich eine gute Antwort? . Es gibt andere Antworten, die die Frage des OP stellen, und sie wurden vor einiger Zeit veröffentlicht. Stellen Sie beim Posten einer Antwort sicher, dass Sie entweder eine neue Lösung oder eine wesentlich bessere Erklärung hinzufügen, insbesondere wenn Sie ältere Fragen beantworten.
help-info.de