Hoe onBackPressed() implementeren in Fragmenten?

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

  1. Maak de interface OnBackPressedListener

    public interface OnBackPressedListener {
        public void doBack();
    }
  2. 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);
        }
    }
  3. Vanaf nu gaan we werken aan onze code BaseActivity en zijn fragmenten

  4. Maak een private listener bovenop de BaseActivity klasse

    protected OnBackPressedListener onBackPressedListener;
  5. Maak een methode om de luisteraar in BaseActivity in te stellen

    public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) {
        this.onBackPressedListener = onBackPressedListener;
    }
  6. in override onBackPressed implementeer iets als dit

    @Override
    public void onBackPressed() {
        if (onBackPressedListener != null)
            onBackPressedListener.doBack();
        anders
            super.onBackPressed();
  7. 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.

Commentaren (6)

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.

Commentaren (7)

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.

Commentaren (3)