Sto imparando come usare i frammenti. Ne ho tre istanze Fragment
inizializzate in cima alla classe. Sto aggiungendo il frammento a un'attività come questa:
Dichiarazione e inizializzazione:
Fragment A = new AFragment();
Fragment B = new BFragment();
Fragment C = new CFragment();
Sostituzione / Aggiunta:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, A);
ft.addToBackStack(null);
ft.commit();
Questi frammenti funzionano correttamente. Ogni frammento è associato all'attività e viene salvato nello stack posteriore senza alcun problema.
Quindi quando lancio A
, C
e poi B
, lo stack si presenta così:
| |
|B|
|C|
|A|
___
E quando premo il pulsante 'indietro', B
viene distrutto e C
ripreso.
Ma, quando lancio il frammento A
una seconda volta, invece di riprendere dallo stack posteriore, viene aggiunto nella parte superiore dello stack posteriore
| |
|A|
|C|
|A|
___
Ma voglio riprendere A
e distruggere tutti i frammenti (se ce ne sono). In realtà, mi piace il comportamento predefinito di back stack.
Come posso farlo?
Previsto: ( A
dovrebbe essere ripreso e i frammenti superiori dovrebbero essere distrutti)
| |
| |
| |
|A|
___
Modifica: (suggerito da A - C)
Questo è il mio codice di prova:
private void selectItem(int position) {
Fragment problemSearch = null, problemStatistics = null;
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
String backStateName = null;
Fragment fragmentName = null;
boolean fragmentPopped = false;
switch (position) {
case 0:
fragmentName = profile;
break;
case 1:
fragmentName = submissionStatistics;
break;
case 2:
fragmentName = solvedProblemLevel;
break;
case 3:
fragmentName = latestSubmissions;
break;
case 4:
fragmentName = CPExercise;
break;
case 5:
Bundle bundle = new Bundle();
bundle.putInt("problem_no", problemNo);
problemSearch = new ProblemWebView();
problemSearch.setArguments(bundle);
fragmentName = problemSearch;
break;
case 6:
fragmentName = rankList;
break;
case 7:
fragmentName = liveSubmissions;
break;
case 8:
Bundle bundles = new Bundle();
bundles.putInt("problem_no", problemNo);
problemStatistics = new ProblemStatistics();
problemStatistics.setArguments(bundles);
fragmentName = problemStatistics;
default:
break;
}
backStateName = fragmentName.getClass().getName();
fragmentPopped = manager.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped) {
ft.replace(R.id.content_frame, fragmentName);
}
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(backStateName);
ft.commit();
// I am using drawer layout
mDrawerList.setItemChecked(position, true);
setTitle(title[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}
Il problema è che quando avvio A
e B
poi premo 'indietro', B
viene rimosso e A
ripreso. e premendo 'indietro' una seconda volta si dovrebbe uscire dall'app. Ma mostra una finestra vuota e devo premere una terza volta per chiuderla.
Inoltre, quando lancio A
, quindi B
, poi C
, poi di B
nuovo ...
Previsto:
| |
| |
|B|
|A|
___
Effettivo:
| |
|B|
|B|
|A|
___
Dovrei ignorare onBackPressed()
qualsiasi personalizzazione o mi sto perdendo qualcosa?