Ну, мое приложение составляет около 5000 строк кода, поэтому я поместил код google git repositery. Но я нашел решение! Во-первых, создавая свою активность, я проверяю, был ли я в области вкладок, с которыми я сталкиваюсь. Если да, я удаляю всю информацию о транзакции.
if(savedInstanceState != null){
int tabPosition = savedInstanceState.getInt("TAB_POSITION");
if(tabPosition == 1){
FragmentManager manager = this.getSupportFragmentManager();
for(int i = 0; i < manager.getBackStackEntryCount(); ++i) {
manager.popBackStack();
}
}
}
Затем, вот как я перезаряжаю весь фрагмент, регистрирующий снова предыдущие corumpted переходы.
TabHost.OnTabChangeListener listener = new TabHost.OnTabChangeListener() {
public void onTabChanged(String tabId) {
Log.d("MainActivity","public void onTabChanged(String tabId) { called");
if(tabId.equals(TAB_A)){
pushFragments(getString(R.string.rss), fragment1rss);
}else if(tabId.equals(TAB_B)){
pushFragments(getString(R.string.worklog), fragment2worklog);
int levelChoice = WorkoutManagerSingleton.getInstance().getLevelChoice();
ListFragment nextFragment = null;
if(levelChoice > 0){
nextFragment = new Fragment2worklog_1subProg();
pushFragmentsRegisterInStack(nextFragment);
}
if(levelChoice > 1){
nextFragment = new Fragment2worklog_2week();
pushFragmentsRegisterInStack(nextFragment);
}
if(levelChoice > 2){
nextFragment = new Fragment2worklog_3day();
pushFragmentsRegisterInStack(nextFragment);
}
if(levelChoice > 3){
nextFragment = new Fragment2worklog_4exercices();
pushFragmentsRegisterInStack(nextFragment);
}
}else if(tabId.equals(TAB_C)){
pushFragments(getString(R.string.testimonials), fragment3testimonials);
}else if(tabId.equals(TAB_D)){
pushFragments(getString(R.string.recipes), fragment4recipe);
}else if(tabId.equals(TAB_E)){
pushFragments(getString(R.string.archives), fragment5archives);
}else if(tabId.equals(TAB_F)){
pushFragments(getString(R.string.book), fragment6book);
}
Log.d("MainActivity","public void onTabChanged(String tabId) { end");
}
};
/*
* adds the fragment to the FrameLayout
*/
public void pushFragments(String tag, Fragment fragment){
FragmentManager manager = this.getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.replace(android.R.id.tabcontent, fragment);
ft.commit();
}
public void pushFragmentsRegisterInStack(Fragment fragment){
FragmentManager manager = this.getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.replace(android.R.id.tabcontent, fragment);
ft.addToBackStack(null);
ft.commit();
}
Хорошо, но это разрушает и воссоздает каждый фрагмент каждый раз. У меня просто вопрос. Есть ли автоматический способ справиться с тем фактом, что в моем фрагменте я делаю много транзакций фрагмента (переадресация через ListFragment): \t \t FragmentTransaction transaction = getFragmentManager(). BeginTransaction(); \t \t сделка.replace (this.getId(), newFragment); \t \t transaction.addToBackStack (null); \t \t transaction.commit(); Или мне нужно отслеживать текущую транзакцию и обрабатывать ее вручную? –
Я думаю, что самый простой способ сделать это - просто отслеживать ваши активные фрагменты. Эти фрагменты вы переходите ко всем разным фрагментам или к тем же фрагментам с другим контентом? . –
Теперь следить за текущим уровнем фрагмента (я могу перемещаться по 4 ListFragment у меня есть этот код в моем OnCreate метод основной деятельности:. \t \t INT levelChoice = WorkoutManagerSingleton.getInstance() getLevelChoice(); \t \t если (levelChoice == 0) { \t \t \t this.fragment2worklog = новый Fragment2worklog(); \t \t} иначе, если (levelChoice == 1) { \t \t \t this.fragment2worklog = новый Fragment2worklog_1subProg(); \t \t} else if (levelChoice == 2) { \t \t \t это.fragment2worklog = new Fragment2worklog_2week(); \t \t} еще если (levelChoice == 3) { \t \t \t ... –