[英]Fragments Not Working Correctly After Orientation Change
我遇到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
做一些事情?
提前致谢。
编辑我现在已经看到在重新创建活动时再次调用onTabSelected。 这可能是我的问题的原因,片段连接不止一次?
这是我的活动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)
)。 你也可以从外面设置这个,但我不认为你这样做。
检查onCreate
上if(savedInstanceState == null)
也可以解决这个问题,我认为这是一个更好的方法! :)
听起来你的onCreate
方法中没有包含在if(savedInstanceState == null)
,所以除了从savedInstanceState包中恢复的片段之外,你还要创建另一个片段。
编辑
仔细查看你的代码,我认为我对onCreate有误,你的onTabSelected应该处理它。 我认为你的if (mFragment == null)
总是为null,因为你没有尝试找到片段。 将该代码部分更改为:
@Override
public void onTabSelected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mTag); // add this
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
}
}
我发现实际上忽略了setRetainInstance
,并且android.support.v4.app.FragmentManager
创建的所有片段都存储在onSaveInstanceState
,并在onCreate
中重新创建。
对我来说,解决方案是直截了当地删除多余的片段: https : //stackoverflow.com/a/13996054/341091
我或多或少有同样的问题,但上面提到的解决方案在我的情况下似乎没有成功。 最终我找到了以下解决方案:
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if (mFragment == null) {
mFragment = Fragment.instantiate(mActivity, mClass.getName());
ft.replace(android.R.id.content, mFragment, mTag); // Use replace iso add
}
else {
ft.attach(mFragment);
}
}
if(savedInstanceState == null)始终不起作用。 有时savedInstanceState!= null,因为横向方向需要添加另一个片段。
另一种方法是测试fm.findFragmentById(R.id.frameLayoutLeft),无论方向是什么,是否为null,如果是,则创建新的片段实例,否则什么都不做。 如果在横向模式下需要第二个片段,则首先需要检查它是否为横向,如果是,请检查fm.findFragmentById(R.id.frameLayoutRight)是否为空。 如果为null,则为create,否则不执行任何操作,因为它已经由Android OS保留。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.