C'è un modo in cui possiamo implementare onBackPressed()
in Android Fragment simile al modo in cui implementiamo in Android Activity?
Poiché il ciclo di vita di Fragment non ha onBackPressed()
. C'è qualche altro metodo alternativo per superare onBackPressed()
nei frammenti Android 3.0?
Secondo la risposta di @HaMMeRed ecco uno pseudocodice di come dovrebbe funzionare.
Diciamo che la tua attività principale si chiama BaseActivity
che ha frammenti figli (come nell'esempio di SlidingMenu lib).
Ecco i passaggi:
Prima abbiamo bisogno di creare un'interfaccia e una classe che implementa la sua interfaccia per avere un metodo generico
Creare l'interfaccia di classe `OnBackPressedListener
interfaccia pubblica OnBackPressedListener {
public void doBack();
}
Creare una classe che implementi le abilità di `OnBackPressedListener
classe pubblica BaseBackPressedListener implementa OnBackPressedListener {
attività privata finale di FragmentActivity;
public BaseBackPressedListener(FragmentActivity activity) {
this.activity = activity;
}
@Override
public void doBack() {
activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}
Da ora, lavoreremo sul nostro codice BaseActivity
e i suoi frammenti
Create un ascoltatore privato sopra la vostra classe BaseActivity
.
protected OnBackPressedListener onBackPressedListener;
creare un metodo per impostare l'ascoltatore in BaseActivity
.
public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) {
this.onBackPressedListener = onBackPressedListener;
}
in override onBackPressed
implementiamo qualcosa del genere
@Override
public void onBackPressed() {
se (onBackPressedListener != null)
onBackPressedListener.doBack();
altrimenti
super.onBackPressed();
nel tuo frammento in onCreateView
dovresti aggiungere il nostro ascoltatore
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
activity = getActivity();
((BaseActivity)activity).setOnBackPressedListener(new BaseBackPressedListener(activity));
View view = ... ;
//stuff con la vista
restituire la vista;
}
Voilà, ora quando clicchi indietro nel frammento dovresti catturare il tuo metodo on back personalizzato.
Se vuoi questo tipo di funzionalità dovresti sovrascriverla nella tua attività, e poi aggiungere un'interfaccia YourBackPressed
a tutti i tuoi frammenti, che chiami sul relativo frammento ogni volta che il pulsante indietro viene premuto.
Modifica: vorrei aggiungere la mia risposta precedente.
Se dovessi farlo oggi, userei una trasmissione, o eventualmente una trasmissione ordinata se mi aspettassi che altri pannelli si aggiornino all'unisono al pannello principale/contenuto principale.
LocalBroadcastManager
nella libreria di supporto può aiutare con questo, e basta inviare il broadcast in onBackPressed
e sottoscrivere i tuoi frammenti che si preoccupano. Penso che Messaging sia un'implementazione più disaccoppiata e scalerebbe meglio, quindi sarebbe la mia raccomandazione ufficiale di implementazione ora. Basta usare l'azione Intent
come filtro per il tuo messaggio. invia la tua ACTION_BACK_PRESSED
appena creata, inviala dalla tua attività e ascoltala nei frammenti pertinenti.
Basta aggiungere addToBackStack
mentre stai passando tra i tuoi frammenti come qui sotto:
fragmentManager.beginTransaction().replace(R.id.content_frame,fragment).addToBackStack("tag").commit();
se scrivi addToBackStack(null)
, lo gestirà da solo ma se dai un tag, dovresti gestirlo manualmente.