Er det en måte vi kan implementere onBackPressed()
i Android Fragment på samme måte som vi implementerer i Android Activity?
Siden Fragment-livssyklusen ikke har onBackPressed()
. Er det noen annen alternativ metode for å overkjøre onBackPressed()
i Android 3.0-fragmenter?
Ifølge @HaMMeRed svaret her er pseudokode hvordan skal det fungere.
La oss si at hovedaktiviteten din kalles BaseActivity
som har underordnede fragmenter (som i SlidingMenu lib eksempel).
Her er trinnene:
Først må vi opprette grensesnitt og klasse som implementerer grensesnittet for å ha generisk metode
Opprett klassegrensesnitt OnBackPressedListener
(PåBackPressedListener)
public interface OnBackPressedListener {
public void doBack();
}
Opprett klasse som implementerer egenskapene til OnBackPressedListener
.
public class BaseBackPressedListener implementerer OnBackPressedListener {
private final FragmentActivity aktivitet;
public BaseBackPressedListener(FragmentAktivitet aktivitet) {
this.activity = activity;
}
@Override
public void doBack() {
activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}
Siden nå, vil vi jobbe på vår kode BaseActivity
og dens fragmenter
Opprett en privat lytter på toppen av klassen BaseActivity
.
beskyttet OnBackPressedListener onBackPressedListener;
Opprett metode for å sette lytteren i BaseActivity
.
public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) {
this.onBackPressedListener = onBackPressedListener;
}
i overstyre onBackPressed
implementere noe som dette
@Override
public void onBackPressed() {
if (onBackPressedListener != null)
onBackPressedListener.doBack();
else
super.onBackPressed();
I fragmentet ditt i onCreateView
bør du legge til vår listener
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
activity = getActivity();
((BaseActivity)activity).setOnBackPressedListener(new BaseBackPressedListener(activity));
View view = ... ;
//stuff med visning
return view;
}
Voila, nå når du klikker tilbake i fragmentet, bør du fange din skikk på tilbake-metoden.
Hvis du vil ha denne typen funksjonalitet, må du overstyre den i aktiviteten din, og deretter legge til et "YourBackPressed"-grensesnitt i alle fragmentene dine, som du kaller på det aktuelle fragmentet når du trykker på tilbake-knappen.
Rediger: Jeg vil gjerne legge til mitt forrige svar.
Hvis jeg skulle gjøre dette i dag, ville jeg bruke en kringkasting, eller muligens en bestilt kringkasting hvis jeg forventet at andre paneler skulle oppdateres unisont til master / hovedinnholdspanelet.
LocalBroadcastManager
i støttebiblioteket kan hjelpe med dette, og du sender bare sendingen i onBackPressed
og abonnerer på fragmentene dine som bryr seg. Jeg tror at Messaging er en mer frikoblet implementering og vil skalere bedre, så det vil være min offisielle implementeringsanbefaling nå. Bare bruk Intent
handlingen som et filter for meldingen din. send den nyopprettede ACTION_BACK_PRESSED
, send den fra aktiviteten din og lytt etter den i de relevante fragmentene.
Bare legg til addToBackStack
mens du går over mellom fragmentene dine som nedenfor:
fragmentManager.beginTransaction().replace(R.id.content_frame,fragment).addToBackStack("tag").commit();
hvis du skriver addToBackStack(null)
, vil den håndtere det av seg selv, men hvis du gir en tag , bør du håndtere det manuelt.