每当我第一次打开我的应用程序时,我的 xml 文件中的 3 个容器中都会正确显示三个片段。单击操作栏上的选项卡后,容器的一个片段被交换为另一个。
问题
每当我打开应用程序时,切换到第二个选项卡,使用后退箭头退出应用程序,然后重新打开应用程序并重新选择第二个选项卡,片段为空白。什么都没有出现,第三个选项卡也出现同样的问题。为什么不显示第二个和第三个片段?
每当我第一次打开我的应用程序时,我的 xml 文件中的 3 个容器中都会正确显示三个片段。单击操作栏上的选项卡后,容器的一个片段被交换为另一个。
每当我打开应用程序时,切换到第二个选项卡,使用后退箭头退出应用程序,然后重新打开应用程序并重新选择第二个选项卡,片段为空白。什么都没有出现,第三个选项卡也出现同样的问题。为什么不显示第二个和第三个片段?
// from onCreate() method of your DefaultActivity class, call this method:
// file: DefaultActivity.java
...
...
...
private void addTabs() {
// get support ActionBar and set navigation mode to Tabs
ActionBar bar = getSupportActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Add first tab to ActionBar, and set the TabListener to a new TabListner object
String title1 = "first_tab";
ActionBar.Tab tab1 = bar.newTab();
tab1.setText(title1);
tab1.setTabListener(new TabListener(this, title1, Fragment1.class));
bar.addTab(tab1);
// Add second tab to ActionBar, and set the TabListener to a new TabListner object
String title2 = "second_tab";
ActionBar.Tab tab2 = bar.newTab();
tab2.setText(locationsTitle);
tab2.setTabListener(new TabListener(this, tab2, Fragment2.class));
bar.addTab(tab2);
// Add third tab to ActionBar, and set the TabListener to a new TabListner object
String title3 = "third_tab";
ActionBar.Tab tab3 = bar.newTab();
tab3.setText(title3);
tab3.setTabListener(new TabListener(this, title3, Fragment3.class));
bar.addTab(tab3);
}
...
...
...
现在,您需要创建三个片段 - Fragment1、Fragment2 和 Fragment3,并创建一个 TabListener:
// file: TabListener.java
public class TabListener implements ActionBar.TabListener {
private final FragmentActivity mActivity;
private final String mTag;
private final Class mFragmentClass;
private Fragment mFragment;
public TabListener(FragmentActivity activity, String tag, Class fragmentClass) {
mActivity = activity;
mTag = tag;
mFragmentClass = fragmentClass;
// see if we already have the fragment with given tag. it's okay if it is null
mFragment = activity.getSupportFragmentManager().findFragmentByTag(tag);
}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
if (mFragment == null) {
// instantiate a new fragment for the given class
mFragment = SherlockFragment.instantiate(mActivity, mFragmentClass.getName());
// place in the default root viewgroup - android.R.id.content
ft.replace(android.R.id.content, mFragment, mTag);
} else {
if (mFragment.isDetached())
ft.attach(mFragment);
}
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
if (mFragment != null) {
ft.detach(mFragment);
}
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
}
}
这就是你所需要的。
public static boolean started
我通过在每个片段中使用一个值来解决它。在每个片段的类中,在onCreateView()
I setstarted = true;
和onDestroyView()
I set我的主要活动started = false;
的onTabSelected()
方法中,我读取了这个boolean
值,如果是true
,我将片段附加回它的容器,但如果是false
,我创建一个新的特定片段的实例并将其添加到容器中。