2013-05-21 4 views
0

Я не понимаю, как использовать экземпляр сохранения при вращении экрана, в то время как я использую TabHost внутри FragmentActivity. Я нашел много вещей об этом, но либо говорил о том, чтобы использовать onRetainNonConfigurationInstance(), который устарел. Или tu использует setRetainInstance (boolean), но FragmentActivity не имеет этого метода. Только Фрагмент.TabHost в FragmentActivity и вращение экрана

На этой ссылке вы можете узнать код моей основной деятельности: http://code.google.com/p/musclehackandroid/source/browse/src/com/musclehack/musclehack/MainActivity.java

Спасибо заранее,

Седрик

ответ

0

Вы можете использовать onSavedInstanceState, чтобы сохранить текущую выбранную вкладку:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    outState.putInt("TAB_POSITION", host.getCurrentTab()); 
    super.onSaveInstanceState(outState); 
} 

Впоследствии вы можете переустановить выбранное положение в onCreate:

if (savedInstanceState != null) { 
    host.setCurrentTab(savedInstanceState.getInt("TAB_POSITION")); 
} 
+0

Хорошо, но это разрушает и воссоздает каждый фрагмент каждый раз. У меня просто вопрос. Есть ли автоматический способ справиться с тем фактом, что в моем фрагменте я делаю много транзакций фрагмента (переадресация через ListFragment): \t \t FragmentTransaction transaction = getFragmentManager(). BeginTransaction(); \t \t сделка.replace (this.getId(), newFragment); \t \t transaction.addToBackStack (null); \t \t transaction.commit(); Или мне нужно отслеживать текущую транзакцию и обрабатывать ее вручную? –

+0

Я думаю, что самый простой способ сделать это - просто отслеживать ваши активные фрагменты. Эти фрагменты вы переходите ко всем разным фрагментам или к тем же фрагментам с другим контентом? . –

+0

Теперь следить за текущим уровнем фрагмента (я могу перемещаться по 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 ... –

0

Ну, мое приложение составляет около 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(); 
}