118 votes

Terminer l'activité en cours à partir d'un fragment

J'ai un fragment dans une activité que j'utilise comme tiroir de navigation. Il contient des boutons qui, lorsqu'ils sont cliqués, démarrent de nouvelles activités (startActivity d'un fragment appelle simplement startActivity sur l'activité en cours).

Je n'arrive pas à comprendre comment terminer l'activité en cours après en avoir commencé une nouvelle.

Je cherche à obtenir quelque chose comme cela dans le fragment :

@Override
public void onClick(View view) {
    // TODO Auto-generated method stub
    if (view == mButtonShows) {
        Intent intent = new Intent(view.getContext(), MyNewActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        finish();
    } 
}

Mais il semble que Fragment.class n'implémente pas finish() (comme il implémente startActivity(...)).

J'aimerais que la pile arrière de l'activité soit effacée lorsqu'ils lancent la deuxième activité. (pour que le fait d'appuyer sur la touche retour de la nouvelle activité les ramène techniquement au lanceur).

334voto

coder_For_Life22 Points 8908

Lorsque vous travaillez avec des fragments, au lieu d'utiliser this ou en se référant au contexte, toujours utiliser getActivity() . Vous devez appeler

Java

getActivity().finish();

Kotlin

activity.finish()

pour terminer votre activité à partir d'un fragment.

30voto

Jon F Hancock Points 1698

En fait...

Je ne voudrais pas que le fragment essaie de terminer l'activité. À mon avis, cela confère trop d'autorité au fragment. Au lieu de cela, j'utiliserais le guide ici : http://developer.Android.com/training/basics/fragments/communicating.html

Demandez au fragment de définir une interface que l'activité doit mettre en œuvre. Lancer un appel à l'activité, puis laisser l'activité décider de ce qu'elle doit faire avec l'information. Si l'activité souhaite se terminer elle-même, elle peut le faire.

13voto

Sasquatch Points 111

Comme mentionné par Jon F Hancock C'est ainsi qu'un fragment peut "clôturer" l'activité en suggérant l'activité à clôturer. Cela rend le fragment portable, comme c'est la raison d'être des fragments. Si vous l'utilisez dans une autre activité, vous ne voudrez peut-être pas fermer l'activité.

Le code ci-dessous est un extrait d'une activité et d'un fragment comportant un bouton de sauvegarde et d'annulation.

Activité du joueur

public class PlayerActivity extends Activity 
    implements PlayerInfo.PlayerAddListener {

    public void onPlayerCancel() {
       // Decide if its suitable to close the activity, 
       //e.g. is an edit being done in one of the other fragments?
       finish();
    }
}

PlayerInfoFragment, qui contient une interface que l'activité appelante doit mettre en œuvre.

public class PlayerInfoFragment extends Fragment {
   private PlayerAddListener callback; // implemented in the Activity

   @Override
   public void onAttach(Activity activity) {
     super.onAttach(activity);
     callback= (PlayerAddListener) activity;
   }

   public interface PlayerAddListener {
       public void onPlayerSave(Player p); // not shown in impl above
       public void onPlayerCancel();
   }

   public void btnCancel(View v) {
      callback.onPlayerCancel(); // the activity's implementation
   }
}

5voto

Madhu Jayarama Points 317

Vous devez utiliser la méthode getActivity() pour terminer l'activité du fragment.

getActivity().finish();

5voto

rahat Points 1479

Cela ne nécessite pas d'assertion, dernière mise à jour dans fragment dans Android JetPack

requireActivity().finish();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X