Existe-t-il un moyen d'implémenter onBackPressed()
dans Android Fragment de manière similaire à ce que nous implémentons dans Android Activity ?
Comme le cycle de vie de Fragment n'a pas onBackPressed()
. Existe-t-il une autre méthode alternative pour contourner onBackPressed()
dans les fragments Android 3.0 ?
D'après la réponse de @HaMMeRed, voici le pseudo-code de fonctionnement.
Disons que votre activité principale est appelée BaseActivity
qui a des fragments enfants (comme dans l'exemple de la librairie SlidingMenu).
Voici les étapes :
Tout d'abord, nous devons créer une interface et une classe qui implémente son interface pour avoir une méthode générique.
Créez l'interface de classe OnBackPressedListener
.
public interface OnBackPressedListener {
public void doBack() ;
}
Créez une classe qui implémente les compétences de l'interface OnBackPressedListener
.
public class BaseBackPressedListener implements OnBackPressedListener {
private final FragmentActivity activity ;
public BaseBackPressedListener(FragmentActivity activity) {
this.activity = activity ;
}
@Override
public void doBack() {
activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) ;
}
}
A partir de maintenant, nous allons travailler sur notre code BaseActivity
et ses fragments.
Créez un écouteur privé au sommet de votre classe BaseActivity
.
Protégé OnBackPressedListener onBackPressedListener ;
Créez une méthode pour définir l'écouteur dans BaseActivity
.
public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) {
this.onBackPressedListener = onBackPressedListener ;
}
dans la surcharge onBackPressed
, implémentez quelque chose comme ceci
@Override
public void onBackPressed() {
si (onBackPressedListener != null)
onBackPressedListener.doBack() ;
sinon
super.onBackPressed() ;
dans votre fragment, dans onCreateView
, vous devez ajouter notre listener
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
activity = getActivity() ;
((BaseActivity)activity).setOnBackPressedListener(new BaseBackPressedListener(activity)) ;
Vue view = ... ;
//stuff with view
retourner la vue ;
}
Voilà, maintenant, lorsque vous cliquez sur le retour dans le fragment, vous devriez attraper votre méthode de retour personnalisée.
Si vous voulez ce genre de fonctionnalité, vous devez la remplacer dans votre activité, puis ajouter une interface YourBackPressed
à tous vos fragments, que vous appelez sur le fragment concerné chaque fois que le bouton retour est pressé.
Edit : J'aimerais ajouter ma réponse précédente.
Si je devais faire cela aujourd'hui, j'utiliserais une diffusion, ou éventuellement une diffusion ordonnée si je m'attendais à ce que d'autres panneaux soient mis à jour à l'unisson du panneau de contenu principal/maître.
Le module [LocalBroadcastManager
][1] de la bibliothèque de support peut vous aider dans ce domaine, et il vous suffit d'envoyer la diffusion dans onBackPressed
et de vous abonner aux fragments qui vous intéressent. Je pense que la messagerie est une implémentation plus découplée et qu'elle s'adapterait mieux, c'est pourquoi je la recommande officiellement maintenant. Utilisez simplement l'action Intent
's comme un filtre pour votre message. Envoyez votre nouvelle ACTION_BACK_PRESSED
, envoyez-la depuis votre activité et écoutez-la dans les fragments concernés.
[1] : http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html
Ajoutez simplement addToBackStack
pendant que vous faites la transition entre vos fragments comme ci-dessous :
fragmentManager.beginTransaction().replace(R.id.content_frame,fragment).addToBackStack("tag").commit();
si vous écrivez addToBackStack(null)
, il le gérera de lui-même mais si vous donnez une balise, vous devrez le faire manuellement.