Android 改变方向时碎片消失
2天前,我发布了一个问题:。所以我决定用片段来创建选项卡,而不是tabActivity。现在我有3个选项卡:选项卡客户端、选项卡设置、选项卡日志。当我运行我的应用程序时,会显示tab1,如果我旋转我的设备,一切正常。当我切换到tab2或tab3时,我会感到惊讶。当我旋转设备时,从这些选项卡中可以看到tab1。这是我的主要容器: 公共类实用性扩展了碎片活动{Android 改变方向时碎片消失,android,tabs,android-fragments,android-fragmentactivity,Android,Tabs,Android Fragments,Android Fragmentactivity,2天前,我发布了一个问题:。所以我决定用片段来创建选项卡,而不是tabActivity。现在我有3个选项卡:选项卡客户端、选项卡设置、选项卡日志。当我运行我的应用程序时,会显示tab1,如果我旋转我的设备,一切正常。当我切换到tab2或tab3时,我会感到惊讶。当我旋转设备时,从这些选项卡中可以看到tab1。这是我的主要容器: 公共类实用性扩展了碎片活动{ /* Tab identif */ static String TAB_clientes = "Clientes"; static Stri
/* 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();
}
当我点击其中一个选项卡内的按钮并替换布局时也会发生同样的情况。当我旋转时,我会看到选项卡1。我必须说,我运行过使用tabActivity而不是片段的应用程序,并且没有这个问题。所以我在这里有点困惑
任何帮助都将不胜感激
已编辑:此问题的解决方案是:
1.-在我的碎片活动上创建以下方法:
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:)给我的帮助。关于方向更改重新创建活动。您可能需要一个变量来跟踪活动选项卡
- 将变量的值保存在onSaveInstanceState()中
- 从savedInstanceState捆绑包还原onCreate()中的值
- 使用还原值正确初始化选项卡
我应该在哪里执行此操作?在上面显示的“我的碎片”活动中,或者在我更改选项卡时调用的“我的碎片”中?如果在onCreate()中设置了选项卡方法,然后它将是恢复活动选项卡值的正确位置。您知道我在哪里可以找到这样的示例吗?非常感谢。我成功了。不确定这是否是最佳做法,但我所做的是:请不要在问题标题前加上
已解决的(接受答案就足够了)或者安卓。好吧,我不会再这样做了;)