yoj*_*nnn 13 android screen-rotation android-fragments
我正在构建一个活动多片段应用程序.每次交易后我都会添加到backstack.在几次隐藏和显示片段然后我旋转手机之后,容器上添加的所有片段都被恢复,每个片段都在另一个片段之上.
可能是什么问题?为什么我的活动会显示我之前隐藏的片段?
我正在考虑隐藏所有以前隐藏的现在显示的片段,但是有更"优雅"的方式吗?
setRetainInstance(true)在每个片段上使用,您的问题将消失.
警告:将此设置为true将更改Fragments生命周期.
在setRetainInstance(true)解决问题的同时,可能会出现您不想使用它的情况.要解决此问题,请在Fragment上设置布尔属性并恢复可见性:
private boolean mVisible = true;
@Override
public void onCreate(Bundle _savedInstanceState) {
super.onCreate(_savedInstanceState);
if (_savedInstanceState!=null) {
mVisible = _savedInstanceState.getBoolean("mVisible");
}
if (!mVisible) {
getFragmentManager().beginTransaction().hide(this).commit();
}
// Hey! no setRetainInstance(true) used here.
}
@Override
public void onHiddenChanged(boolean _hidden) {
super.onHiddenChanged(_hidden);
mVisible = !_hidden;
}
@Override
public void onSaveInstanceState(Bundle _outState) {
super.onSaveInstanceState(_outState);
if (_outState!=null) {
_outState.putBoolean("mVisible", mVisible);
}
}
Run Code Online (Sandbox Code Playgroud)
一旦配置改变(例如屏幕方向),实例将被销毁,但Bundle将被存储并注入新的Fragment实例.
您可能想尝试使用该replace()功能而不是隐藏和显示。当我开始使用时,我遇到了同样的问题,Fragments并且使用替换功能确实有助于Fragments更好地管理。这是一个简单的例子:
fragmentManager.replace(R.id.fragmentContainer, desiredFragment, DESIRED_FRAGMENT_TAG)
.addToBackStack(null)
.commit();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2336 次 |
| 最近记录: |