我有一个使用XML(活动中的setContentView())附加到活动的片段。有一个问题,因为我的片段中有非常动态的视图,所以当方向发生变化时 我必须恢复所有观点状态。
我有问题,因为我正在使用类似的东西:
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("restore", true);
outState.putInt("nAndroids", 2);
}
但是在方向更改后调用param Bundle savedInstanceState的方法时(如onCreateView等),我的savedInstanceState始终为null。
我不是Android中的菜鸟,但现在因为这个问题我很生气......
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (savedInstanceState == null) {
//smth
} else {
// smthelse THIS IS NEVER REACHED BECAUSE BUNDLE IS ALWAYS NULL
}
getListView().setDivider(getResources().getDrawable(R.drawable.list_divider));
}
答案 0 :(得分:61)
所有问题都在于我没有为XML中的片段声明android:id。 Android需要ID或TAG来识别存储的片段并重现其中的所有元素。所以,请记住 - 片段的每个实例都需要唯一的id或标签!
此外,当声明setRetainInstance(true)时,bundle应始终返回null。
答案 1 :(得分:5)
我有一个类似的问题,我总是将savedInstanceState作为null,尽管将包提供给片段。
对我有用的唯一解决方案是
myFragment.setArguments(bundle)
使用我的活动包并执行
Bundle bundle = this.getArguments();
在片段的onCreateView中。
希望这有助于其他人。
答案 2 :(得分:2)
对于片段: -
use this for save state of fragment on orientation.
onCreate(Bundle save)
{
super.onCreate(save);
setRetainInstance(true);
}
参见本教程: - http://techbandhu.wordpress.com/2013/07/02/android-headless-fragment/
活动: -
当您启动应用程序时,在onCreate
中,您的包对象为空,因此您必须进行如下所示的检查,当您旋转屏幕时,将调用onSaveInstance
并且您的包对象是初始化
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);
if (savedInstanceState != null) {
boolean t = outState.getBoolean("restore");
int s = outState.getInt("nAndroids");
}
}
答案 3 :(得分:1)
首先,您应该放置数据,然后调用ip nat inside source list 1 interface g0/0 overload
ip nat inside source static tcp 192.168.0.10 80 123.123.123.4 80
ip nat inside source static tcp 192.168.0.10 443 123.123.123.4 443
super.onSaveInstanceState(outState);
确保活动在public void onSaveInstanceState(Bundle outState) {
outState.putBoolean("restore", true);
outState.putInt("nAndroids", 2);
super.onSaveInstanceState(outState);
}
中没有nohistory
属性或将其设置为 false 。
AndroidManifest.xml
答案 4 :(得分:0)
好的,我知道这是一篇很老的帖子,但我在这里找不到合适的答案,也没有其他地方,所以我发帖告诉我如何解决我的问题。
所以我的片段在一个活动中。我最初尝试仅在Fragment中保存Bundle并在onCreateView中检索它。不过那就是问题所在。
我通过在activity中启动myFragment对象并将该对象放在onSaveInstanceState()的活动Bundle中来修复此问题。然后在onRestoreInstanceState()中检索它。我使用了getSupportFragmentManager()。putFragment / getFragment。然后片段中的savedInstanceState不再为空。
答案 5 :(得分:0)
如果您尝试使用outState保存状态并通过导航到另一个片段来破坏该片段,则它将无法正常工作,在这种情况下,您必须将状态永久保存在sharedPreferences中,或者如果它很大,并且您想要更有条理,您可以使用任何持久性库,例如Room,Realm等。
例如,何时仅应使用outState和savedInstanceState来使Fargment / Activity在配置更改(例如,轮换)或在后台运行时被操作系统杀死的进程中幸存下来。