如何在屏幕方向替换后恢复片段
问题描述:
我有两个片段的活动:DogFragment,LegoFragment。在肖像模式下,我显示DogFragment,并在横向模式下显示LegoFragment。我的问题是片段旋转后不记得它们的状态。有没有办法保存片段的状态?了解活动在方向更改期间被重新创建,并且基于我创建并将DogFragment或LegoFragment附加到活动的方向。如何在屏幕方向替换后恢复片段
这里是活动的onCreate
方法,我添加片段。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (getResources().getConfiguration().orientation ==
Configuration.ORIENTATION_PORTRAIT) {
addDogFragment();
} else {
addLegoFragment();
}
}
private void addDogFragment() {
DogFragment fragment = DogFragment.newInstance(null, null);
getSupportFragmentManager().beginTransaction().
replace(R.id.fragment_container, fragment).commit();
}
private void addLegoFragment() {
LegoFragment fragment = LegoFragment.newInstance(null, null);
getSupportFragmentManager().beginTransaction().
replace(R.id.fragment_container, fragment).commit();
}
我知道FragmentManager有我的片段的副本。但我不确定解决这个问题的最好方法。如果我用标签呼叫replace
,我只是找到了标签,然后再次调用替换?还是有一个标准的方式来做这些事情?
答
试试这个,创建一个类似的功能LegoFragment
private void setDogFragment() {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment removeFragment = mFragmentManager.findFragmentByTag("lego");
if (removeFragment!=null) {
transaction.detach(removeFragment);
}
Fragment fragment = mFragmentManager.findFragmentByTag("dog");
if (fragment != null) {
transaction.attach(fragment);
} else {
fragment = new DogFragment();
transaction.add(R.id.fragment_container, fragment,
"dog");
}
transaction.commit();
}
+0
你真棒!检查和+1!这很好:它是有道理的。所以,感谢您提供清晰的代码。 – learner
答
if (getResources().getConfiguration().orientation ==
Configuration.ORIENTATION_PORTRAIT)
attachFragment(R.id.fragment_container, "dogFragment", DogFragment.class.getName());
else
attachFragment(R.id.fragment_container, "legoFragment", LegoFragment.class.getName());
private FragmentTransaction mCurTransaction;
private FragmentManager mFragmentManager;
public void attachFragment(int containerViewId, String tag, String fragmentClassName){
if (mFragmentManager == null)
mFragmentManager = getSupportFragmentManager(); // or getFragmentManager();
if (mCurTransaction == null)
mCurTransaction = mFragmentManager.beginTransaction();
// Do we already have this fragment?
Fragment fragment = mFragmentManager.findFragmentByTag(tag);
if (fragment != null){
mCurTransaction.attach(fragment);
}else {
fragment = Fragment.instantiate(this, fragmentClassName);
mCurTransaction.add(containerViewId, fragment, tag);
}
}
您应该添加在onConfiguration代码改变。 – k0sh
@ k0sh当你说'那个'代码时,你指的是哪个代码? onCreate内的部分?您能否提供一些解释,说明为什么这种改变可以解决问题? – learner
是的,检查方向更改,只需将其添加到onConfiguration更改,因为此方法将始终在方向更改时触发。 – k0sh