Existuje spôsob, akým môžeme implementovať funkciu onBackPressed()
vo fragmente Androidu podobne ako v aktivite Android?
Keďže životný cyklus Fragmentu nemá funkciu onBackPressed()
. Existuje nejaká iná alternatívna metóda, ako prekonať onBackPressed()
vo fragmentoch Androidu 3.0?
Podľa odpovede @HaMMeRed tu je pseudokód, ako by to malo fungovať.
Povedzme, že vaša hlavná aktivita sa volá BaseActivity
, ktorá má podriadené fragmenty (ako v príklade SlidingMenu lib).
Tu sú kroky:
Najprv musíme vytvoriť rozhranie a triedu, ktorá implementuje jeho rozhranie, aby mala generickú metódu
Vytvorte rozhranie triedy OnBackPressedListener
public interface OnBackPressedListener {
public void doBack();
}
Vytvorte triedu, ktorá implementuje zručnosti 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);
}
}
Odteraz budeme pracovať na našom kóde BaseActivity
a jeho fragmentoch
Vytvorte súkromný poslucháč na vrchole vašej triedy BaseActivity
protected OnBackPressedListener onBackPressedListener;
vytvorte metódu na nastavenie poslucháča v BaseActivity
public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) {
this.onBackPressedListener = onBackPressedListener;
}
v override onBackPressed
implementujte niečo také
@Override
public void onBackPressed() {
if (onBackPressedListener != null)
onBackPressedListener.doBack();
else
super.onBackPressed();
vo vašom fragmente v onCreateView
by ste mali pridať náš poslucháč
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
activity = getActivity();
((BaseActivity)activity).setOnBackPressedListener(new BaseBackPressedListener(activity));
View view = ... ;
//stuff s pohľadom
return view;
}
Voila, teraz by ste mali pri kliknutí späť vo fragmente zachytiť svoju vlastnú metódu on back.
Ak by ste chceli takúto funkcionalitu, museli by ste ju prebrať vo svojej aktivite a potom pridať rozhranie YourBackPressed
do všetkých svojich fragmentov, ktoré zavoláte v príslušnom fragmente vždy, keď je stlačené tlačidlo späť.
Edit: Chcel by som doplniť svoju predchádzajúcu odpoveď.
Ak by som to robil dnes, použil by som broadcast, prípadne nariadený broadcast, ak by som očakával, že ostatné panely sa budú aktualizovať unisono s hlavným/obsahovým panelom.
Pomôcť s tým môže LocalBroadcastManager
v knižnici podpory, pričom stačí vysielať broadcast v onBackPressed
a prihlásiť sa vo svojich fragmentoch, ktoré sa o to starajú. Myslím, že Messaging je viac oddelená implementácia a lepšie by sa škálovala, takže by to teraz bolo moje oficiálne odporúčanie implementácie. Jednoducho použite akciu Intent
's ako filter pre vašu správu. pošlite svoju novovytvorenú ACTION_BACK_PRESSED
, odošlite ju z vašej aktivity a počúvajte ju v príslušných fragmentoch.
Stačí pridať addToBackStack
pri prechode medzi fragmentmi, ako je uvedené nižšie:
fragmentManager.beginTransaction().replace(R.id.content_frame,fragment).addToBackStack("tag").commit();
ak napíšete addToBackStack(null)
, spracuje sa to samo, ale ak zadáte značku , mali by ste to spracovať ručne.