2013-05-07 61 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