我在使用Fragments
和方向更改时遇到问题。
我有一个具有MainActivity
的应用程序,该应用程序通过选项卡式操作栏来处理Fragments
的切换。这是选项卡式操作栏以及选择选项卡时的代码。
private class MyTabListener <T extends android.support.v4.app.Fragment> implements ActionBar.TabListener {
private android.support.v4.app.Fragment mFragment;
private final Activity mActivity;
private final String mTag;
private final Class<T> mClass;
public MyTabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) {
mActivity = activity;
mTag = tag;
mClass = clz;
}
@Override
public void onTabSelected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
if (mFragment == null){ // check to see if the fragment has already been initialised. If not create a new one.
mFragment = android.support.v4.app.Fragment.instantiate(mActivity, mClass.getName());
ft.add(android.R.id.content,mFragment,mTag);
} else {
ft.attach(mFragment); // if the fragment has been initialised attach it to the current activity
}
}
@Override
public void onTabUnselected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
if (mFragment != null){
ft.detach(mFragment); // when a fragment is no longer needed, detach it from the activity but dont destroy it
}
}
@Override
public void onTabReselected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
}
我的看法是,当应用程序首次以纵向模式加载时,一切正常。当我旋转时,由于某种原因,添加了
Fragment1
的另一个实例,但是在选择另一个选项卡时不会将其分离。然后我又旋转回肖像时也是如此。我尝试在
setRetainInstance(true);
中使用Fragments
,但这不起作用。旋转之前,我是否需要重写
Fragments
或对其做些什么?提前致谢。
编辑我现在看到重新创建 Activity 时会再次调用onTabSelected。这可能是我的碎片被多次附着的问题的原因吗?
这是我的 Activity onCreate方法。
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
//setContentView(R.layout.main);
}
// Create the Action Bar with tabs
ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayShowTitleEnabled(false);
//create the tab for track and add it to the action bar.
Tab tab = actionBar.newTab()
.setText("Track")
.setTabListener(new MyTabListener<TrackingFragment>(this,"track",TrackingFragment.class));
actionBar.addTab(tab);
//create the tab for ski tracks and add it to the action bar.
tab = actionBar.newTab()
.setText("Something Tracks")
.setTabListener(new MyTabListener<TrackListFragment>(this,"somethingtracks",TrackListFragment.class));
actionBar.addTab(tab);
//create the tab for photos and add it to the action bar.
tab = actionBar.newTab()
.setText("Photos")
.setTabListener(new MyTabListener<PhotoFragment>(this,"photos",PhotoFragment.class));
actionBar.addTab(tab);
最佳答案
简短修正:
在onTabSelected
方法中,在使用if (mFragment == null)
之前,您需要尝试获取该片段(使用mFragment = getSupportFragmentManager().findFragmentByTag(mTag)
)。您也可以从外部进行设置,但我看不到您这样做。
在if(savedInstanceState == null)
上检查onCreate
也可以解决此问题,不过我认为这是一种更好的方法! :)