Kā implementēt onBackPressed() fragmentos?

Vai ir veids, kā mēs varam implementēt onBackPressed() Android fragmentā, līdzīgi kā mēs to īstenojam Android aktivitātē?

Tā kā fragmenta dzīves ciklā nav onBackPressed(). Vai ir kāda cita alternatīva metode, lai pārvarētu onBackPressed() Android 3.0 fragmentos?

Saskaņā ar @HaMMeRed atbildi šeit ir pseidokods, kā tas darbojas. Pieņemsim, ka jūsu galvenā darbība saucas BaseActivity, kurai ir atvasinātie fragmenti (kā SlidingMenu lib piemērā). Šeit ir soļi:

Vispirms mums ir jāizveido saskarne un klase, kas implementē tās saskarni, lai būtu vispārīga metode.

  1. Izveidot klases interfeisu OnBackPressedListener.

    publiskais interfeiss OnBackPressedListener {
        public void doBack();
    }
  2. Izveidojiet klasi, kas īsteno OnBackPressedListener prasmes.

    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);
        }
    }
  3. Tagad mēs strādāsim ar mūsu kodu BaseActivity un tā fragmentiem.

  4. Izveidojiet privātu klausītāju savas klases BaseActivity augšpusē.

    protected OnBackPressedListener onBackPressedListener;
  5. izveidojiet metodi klausītāja iestatīšanai BaseActivity.

    public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) {
        this.onBackPressedListener = onBackPressedListener;
    }
  6. override onBackPressed implementēt kaut ko līdzīgu šim

    @Override
    public void onBackPressed() {
        if (onBackPressedListener != null)
            onBackPressedListener.doBack();
        citādi
            super.onBackPressed();
  7. savā fragmentā onCreateView jums jāpievieno mūsu klausītājs

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        activity = getActivity();
    
        ((BaseActivity)activity).setOnBackPressedListener(new BaseBackPressedListener(activity));
    
        View view = ... ;
    //stuff ar skatu
    
        return view;
    }

Voila, tagad, kad jūs noklikšķiniet atpakaļ fragmentā, jums vajadzētu noķert savu pielāgoto atpakaļ metodi.

Komentāri (6)

Ja vēlaties šādu funkcionalitāti, jums būtu nepieciešams to pārspēt savā aktivitātē un pēc tam pievienot interfeisu YourBackPressed visiem saviem fragmentiem, kuru izsaucat attiecīgajā fragmentā, kad tiek nospiesta atpakaļgaitas poga.

Rediģēt: Es gribētu papildināt savu iepriekšējo atbildi.

Ja man tas būtu jādara šodien, es izmantotu apraidi vai, iespējams, sakārtotu apraidi, ja es sagaidītu, ka citi paneļi atjaunināsies vienlaicīgi ar galveno/galveno satura paneli.

Ar to var palīdzēt LocalBroadcastManager atbalsta bibliotēkā, un jūs vienkārši nosūtiet apraidi onBackPressed un parakstieties savos fragmentos, kas rūp. Es domāju, ka Messaging ir vairāk atdalīta implementācija un būtu labāk mērogojama, tāpēc tagad tā būtu mans oficiālais implementācijas ieteikums. Vienkārši izmantojiet Intent's darbību kā ziņojuma filtru. nosūtiet savu jaunizveidoto ACTION_BACK_PRESSED, nosūtiet to no savas darbības un klausieties to attiecīgajos fragmentos.

Komentāri (7)

Vienkārši pievienojiet addToBackStack, kamēr pārejat starp fragmentiem, kā norādīts zemāk:

fragmentManager.beginTransaction().replace(R.id.content_frame,fragment).addToBackStack("tag").commit();

ja jūs rakstāt addToBackStack(null) , tas pats to apstrādās, bet, ja jūs sniedzat tagu, jums tas jāapstrādā manuāli.

Komentāri (3)