2013-05-07 64 views
3

2天前我發佈了一個問題:New layouts in TabHost。所以我決定創建帶有片段而不是tabActivity的選項卡。所以現在我有3個選項卡:tab_clients,tab_settings,tab_logut。當我運行我的應用程序tab1顯示,如果我旋轉我的設備一切工作正常。當我旋轉我的設備時,從這些選項卡切換到tab2或tab3時,我感到意外,我得到了tab1的視圖。這是我的主要容器:改變方向時片段消失

公共類AplicacionActivity擴展FragmentActivity {

/* Tab identif */ 
static String TAB_clientes = "Clientes"; 
static String TAB_settings = "Settings"; 
static String TAB_logout = "Logout"; 

TabHost mTabHost; 

ClientesActivity fragmentClientes; 
SettingsActivity fragmentSettings; 
LogoutActivity fragmentLogout; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_aplicacion); 

    fragmentClientes = new ClientesActivity(); 
    fragmentSettings = new SettingsActivity(); 
    fragmentLogout = new LogoutActivity(); 

    mTabHost = (TabHost)findViewById(android.R.id.tabhost); 
    mTabHost.setOnTabChangedListener(listener); 
    mTabHost.setup(); 

    iniTab(); 
} 


public void iniTab() { 

    Resources res = getResources(); 

    //TabHost.TabSpec: A tab has a tab indicator, content, and a tag that is used to keep track of it. 
    TabHost.TabSpec spec = mTabHost.newTabSpec(TAB_clientes); 
    mTabHost.setCurrentTab(-3); 

    //TabHost.TabContentFactory: Makes the content of a tab when it is selected. 
    spec.setContent(new TabHost.TabContentFactory() { 
     public View createTabContent(String tag) { 
      return findViewById(android.R.id.tabcontent); 
     } 
    }); 
    spec.setIndicator(" Clientes ", res.getDrawable(R.drawable.clientes)); 
    mTabHost.addTab(spec); 


    spec = mTabHost.newTabSpec(TAB_settings); 
    spec.setContent(new TabHost.TabContentFactory() { 
     public View createTabContent(String tag) { 
      return findViewById(android.R.id.tabcontent); 
     } 
    }); 
    spec.setIndicator(" Settings ",res.getDrawable(R.drawable.settings)); 
    mTabHost.addTab(spec); 

    spec = mTabHost.newTabSpec(TAB_logout); 
    spec.setContent(new TabHost.TabContentFactory() { 
     public View createTabContent(String tag) { 
      return findViewById(android.R.id.tabcontent); 
     } 
    }); 
    spec.setIndicator(" Logout ",res.getDrawable(R.drawable.logouticon)); 
    mTabHost.addTab(spec); 
} 

/* 
* TabChangeListener for change the tab when is selected 
*/ 
TabHost.OnTabChangeListener listener = new TabHost.OnTabChangeListener() { 
    public void onTabChanged(String tabId) { 
     /*Set current tab..*/ 
     if(tabId.equals(TAB_clientes)){ 
      pushFragments(tabId, fragmentClientes); 
     }else if(tabId.equals(TAB_settings)){ 
      pushFragments(tabId, fragmentSettings); 
     }else if(tabId.equals(TAB_logout)){ 
      pushFragments(tabId, fragmentLogout); 
     } 
    } 
}; 

/* 
* insert the fragment into the FrameLayout 
*/ 
public void pushFragments(String tag, Fragment fragment){ 

    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction ft = manager.beginTransaction(); 

    ft.replace(android.R.id.tabcontent, fragment); 
    ft.commit(); 
} 

當我點擊該按鈕我的標籤之一的內部,並更換佈局同樣的情況。當我旋轉時,我看到了tab1的視圖。我不得不說,我已經運行了使用tabActivity而不是碎片的應用程序,並且沒有這個問題。所以我在這裏有點困惑。

任何幫助將被折衷。

編輯:這個解決方案是:

1 .-創建我的FragmentActivity以下方法:

protected void onSaveInstanceState(Bundle bundle) { 
    super.onSaveInstanceState(bundle); 
    Fragment fragmentAct = this.getSupportFragmentManager().findFragmentById(android.R.id.tabcontent); 
    bundle.putString("fragmentAct", fragmentoActual.getTag()); 
    Log.e("layout-saving",fragmentAct.getTag()); 
} 

正如你可以看到我的包保存片段的標籤我在旋轉設備之前看到的

2:在我的我的FragmentActivity的onCreate方法添加以下代碼:

if (savedInstanceState != null){ 
    String value = savedInstanceState.getString("fragmentAct"); 
    establishLayout(value); 
} 

3 .-我創建一個名爲establishLayout方法:

public void establishLayout(String tagFragment){ 
    mTabHost.setCurrentTabByTag(tagFragment); 
    Fragment fragmentoActual = this.getSupportFragmentManager().findFragmentByTag(tagFragment); 
    if(fragmentoActual!=null){ 
     pushFragments(tagFragment, fragmentoActual); 
    } 
} 

4.-我創建方法pushFragments:

public void pushFragments(String tag, Fragment fragment){ 
    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction ft = manager.beginTransaction(); 
    ft.replace(android.R.id.tabcontent, fragment, tag); 
    ft.commit(); 
} 

就是這樣!每當我改變設備的方向時,我都不會失去活動的佈局! 非常感謝我從@Yuri獲得的幫助:)

+0

請不要用'solved'(驗收前綴您的問題標題一個答案就足夠了)或Android。 – Luksprog 2013-05-09 04:37:12

+0

好的,我不會再那樣做了) – kiduxa 2013-05-09 13:47:29

回答

1

在定位更改時,重新創建一個活動。您可能需要一個跟蹤活動選項卡

  • 的保存變量的onSaveInstanceState中的值的變量()
  • 恢復的onCreate()從savedInstanceState捆綁的價值。
  • 恢復使用的值正確初始化標籤
在處理配置更改

的更多信息可以在Android中可以找到指導: http://developer.android.com/guide/components/activities.html#ConfigurationChanges

+0

我應該在哪裏做這個?在我上面顯示的FragmentActivity中,或者在我更改選項卡時調用的片段中? – kiduxa 2013-05-07 23:14:00

+0

如果選項卡在活動的onCreate()方法中設置,那麼它將是恢復活動選項卡的值的正確位置 – Y2i 2013-05-07 23:16:15

+0

您是否知道在哪裏可以找到此示例? – kiduxa 2013-05-07 23:26:18