Bouton Retour et actualisation de l'activité précédente

84

Si nous avons deux activités:

  1. Liste des fichiers et heure de la dernière modification
  2. Activité d'édition de fichiers

Un utilisateur sélectionne un fichier dans la liste et est dirigé vers l'activité d'édition de fichier. Une fois l'édition terminée, l'utilisateur appuie sur le bouton retour pour revenir à la liste des fichiers.

La liste n'est pas rechargée et par conséquent une valeur incorrecte est affichée pour l'heure de modification des fichiers qui viennent d'être édités.

Quelle est la méthode appropriée pour actualiser la liste de fichiers après avoir appuyé sur le bouton de retour?

Cet exemple suppose qu'aucune base de données n'est utilisée, juste un ArrayAdapter.

Paul
la source
1
onRestart () devrait mieux fonctionner. onResume () sera appelé deux fois, et onRestart () ne sera appelé que lorsque vous appuyez sur le bouton retour.
Sarah Sakamoto

Réponses:

108

Une option serait d'utiliser le onResume de votre première activité.

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

Ou vous pouvez démarrer l'activité pour le résultat:

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

Dans secondActivity si vous souhaitez renvoyer des données:

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

si vous ne souhaitez pas renvoyer de données:

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

Maintenant, dans votre classe FirstActivity, écrivez le code suivant pour la onActivityResult()méthode

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
la source
et si je ne veux pas terminer l'activité en cours et que l'activité précédente soit mise à jour
Mansuu ....
@Waza_Ne onResumepas m'appeler, une idée pourquoi? ( J'ai essayé onRestartet onPauseaussi, mais aucun d'entre eux n'a été appelé )
Mehdi Dehghani
Dans mon cas, je suis allé à l'activité de Fragment. Donc, en revenant d'Activité à Fragment, comme d'autres réponses mentionnent onRestart () qui n'est pas contenu dans Fragment, donc, cette réponse a fonctionné pour moi. Pour un fragment, vous pouvez utiliser onResume ().
Feroz Khan
39

Je pense que onRestart () fonctionne mieux pour cela.

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

Vous pouvez coder ce que vous voulez faire lorsque l'activité est redémarrée (appelée à nouveau à partir de l'événement «bouton de retour appuyé») dans onRestart ().

Par exemple, si vous voulez faire la même chose que vous faites dans onCreate (), collez le code dans onRestart () (par exemple, reconstruire l'interface utilisateur avec les valeurs mises à jour).

Sarah Sakamoto
la source
7
C'est trivial, mais je dois le dire: évidemment, il serait préférable de déplacer votre code onCreate () dans une méthode distincte que vous invoquerez ensuite à la fois à partir de onCreate () ainsi que de onRestart () au lieu de copier-coller.
Ricardo van den Broek
Vous pouvez également utiliser onCreate () uniquement pour gonfler les vues et instancier des variables globales et utiliser onStart () pour les affecter / (re) les définir. Ainsi, votre init () (ou ce que vous voulez appeler) sera appelé chaque fois que l'activité démarre; c'est-à-dire après onCreate () ou après onRestart ().
jwehrle
C'est vraiment utile si vous avez besoin de réinitialiser le ViewModel de vos activités. Permet de récupérer à nouveau de la base de données, configurer les variables d'instance ...
énorme
34

en principal:

@Override
public void onRestart()
{
    super.onRestart();
    finish();
    startActivity(getIntent());
}
hamze shoae
la source
Je suppose que cela concerne l'activité en cours et non l'activité précédente?
Si8
1
J'ai eu le même problème, sauf que le mien était un fragment et non une activité. Ainsi, j'ai suivi les conseils ici et cela a fonctionné: stackoverflow.com/questions/35039512/…
David C.
8

Je recommanderais de remplacer la onResume()méthode dans l'activité numéro 1 et d'inclure du code pour actualiser votre adaptateur de tableau, cela se fait en utilisant[yourListViewAdapater].notifyDataSetChanged();

Lisez ceci si vous rencontrez des difficultés pour actualiser la liste: Actualisation de la vue Liste Android

aveugle
la source
2

Si vous souhaitez actualiser l'activité précédente, cette solution devrait fonctionner:

Dans l'activité précédente où vous souhaitez actualiser:

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

J'ai juste la catégorie des favoris, donc lorsque je clique sur l'élément des favoris, ces informations apparaissent et si je ne l'aime pas - cet élément doit être supprimé des favoris: pour cela, je rafraîchis la base de données et le configure sur adaptateur (pour recyclerview) [Je vous souhaite comprendra mon problème et ma solution]

Aizhan Nessipbayeva
la source
pensez à ajouter quelques explications
Gahan
1
 @Override
protected void onRestart() {
    super.onRestart();
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
}

Dans l'activité précédente, utilisez ce code. Cela fera une transition en douceur et rechargera l'activité lorsque vous reviendrez en appuyant sur le bouton de retour.

Robiul Hossain Shah Imran
la source
Pouvez-vous ajouter une description au code et merci pour le message.
Nelles
0

Si vous ne gérez pas un rappel de l'activité d'édition (avec onActivityResult), alors je préfère mettre la logique que vous avez mentionnée dans onStart (ou peut-être dans onRestart), car l'avoir dans onResume semble exagéré, étant donné que les changements ne se produisent qu'après onStop.

Dans tous les cas, familiarisez-vous avec le cycle de vie des activités . De plus, notez les méthodes onRestoreInstanceState et onSaveInstanceState, qui n'apparaissent pas dans le joli diagramme du cycle de vie.

(En outre, il vaut la peine de revoir la façon dont le didacticiel du bloc-notes gère ce que vous faites, bien qu'il utilise une base de données.)

Hymne de Thane
la source
0

Le meilleur moyen d'y parvenir est d'utiliser

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

Essaye ça

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

}

ou en Fragment

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

}

Et ajoutez cette méthode à votre onBackPressed () comme

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

C'est ça...

Rahul
la source
0
@Override
public void onBackPressed() {
    Intent intent = new Intent(this,DesiredActivity.class);
    startActivity(intent);
    super.onBackPressed();
}
Syed Zaidi
la source
Cette question date de quelques années et la réponse fournie a été signalée pour examen comme un message de faible qualité. Voici quelques conseils pour Comment rédiger une bonne réponse? . Il y a d'autres réponses qui fournissent la question du PO, et elles ont été publiées il y a quelque temps. Lorsque vous publiez une réponse, assurez-vous d'ajouter soit une nouvelle solution, soit une explication nettement meilleure, en particulier lorsque vous répondez à des questions plus anciennes.
help-info.de