Is er een manier waarop we onBackPressed()
kunnen implementeren in Android Fragment vergelijkbaar met de manier waarop we in Android Activity implementeren?
Aangezien de Fragment lifecycle niet onBackPressed()
heeft. Is er een andere alternatieve methode om onBackPressed()
in Android 3.0 fragmenten te overbruggen?
Volgens @HaMMeRed antwoord hier is pseudocode hoe het zou moeten werken.
Laten we zeggen dat uw hoofdactiviteit BaseActivity
wordt genoemd die kindfragmenten heeft (zoals in SlidingMenu lib voorbeeld).
Hier zijn de stappen:
Eerst moeten we een interface maken en een klasse die de interface implementeert om een generieke methode te hebben
Maak de interface OnBackPressedListener
public interface OnBackPressedListener {
public void doBack();
}
Maak een klasse die de vaardigheden van OnBackPressedListener
implementeert
public class BaseBackPressedListener implements OnBackPressedListener {
privé finale FragmentActiviteit activiteit;
public BaseBackPressedListener(FragmentActiviteit activiteit) {
this.activity = activity;
}
@Override
publieke leegte doBack() {
activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}
Vanaf nu gaan we werken aan onze code BaseActivity
en zijn fragmenten
Maak een private listener bovenop de BaseActivity
klasse
protected OnBackPressedListener onBackPressedListener;
Maak een methode om de luisteraar in BaseActivity
in te stellen
public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) {
this.onBackPressedListener = onBackPressedListener;
}
in override onBackPressed
implementeer iets als dit
@Override
public void onBackPressed() {
if (onBackPressedListener != null)
onBackPressedListener.doBack();
anders
super.onBackPressed();
in je fragment in onCreateView
moet je onze listener toevoegen
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
activity = getActivity();
((BaseActivity)activity).setOnBackPressedListener(new BaseBackPressedListener(activity));
View view = ... ;
//dingen met view
retourneer view;
}
Voila, nu als je terug klikt in fragment zou je je aangepaste on back methode moeten vangen.
Als je dat soort functionaliteit wilt, moet je het in je activiteit overriden, en dan een JeBackPressed
interface toevoegen aan al je fragmenten, die je aanroept op het relevante fragment wanneer de terug-knop wordt ingedrukt.
Edit: Ik'zou graag mijn vorige antwoord willen aanvullen.
Als ik dit vandaag zou doen, zou ik'een broadcast gebruiken, of eventueel een geordende broadcast als ik verwachtte dat andere panelen unisono zouden updaten naar het master/main content panel.
LocalBroadcastManager
in de Support Library kan hierbij helpen, en je stuurt de broadcast gewoon in onBackPressed
en abonneer je in je fragmenten die erom geven. Ik denk dat Messaging een meer ontkoppelde implementatie is en beter zou schalen, dus het zou nu mijn officiële implementatie-aanbeveling zijn. Gebruik gewoon de Intent
's action als filter voor je bericht. stuur je nieuw aangemaakte ACTION_BACK_PRESSED
, verstuur het vanuit je activity en luister er naar in de relevante fragmenten.
Voeg addToBackStack
toe tijdens de overgang tussen je fragmenten, zoals hieronder:
fragmentManager.beginTransaction().replace(R.id.content_frame,fragment).addToBackStack("tag").commit();
Als je addToBackStack(null)
schrijft, handelt hij dat zelf af, maar als je een tag opgeeft, moet je dat handmatig doen.