首先,一些背景资料。我有Activity
来托管多个Fragment
个;隐藏和显示这些内容,使得一次只能看到一个Fragment
。每个Fragment
都会托管几个我称之为View
的自定义IncrementCounter
。这些视图显示一个数字,并在点击时将该数字增加1。
在Fragment
中创建setRetainInstance(true)
时,每个Activity
都有Activity
。创建Fragment
后,我会检查autonFragment = (AutonomousScoutingFragment) getFragmentManager()
.findFragmentByTag("auton");
teleopFragment = (TeleoperatedScoutingFragment) getFragmentManager()
.findFragmentByTag("teleop");
postMatchFragment = (PostMatchScoutingFragment) getFragmentManager()
.findFragmentByTag("post_match");
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
if (autonFragment == null) {
Log.d("onCreate", "autonFragment is null!");
autonFragment = new AutonomousScoutingFragment();
autonFragment.setRetainInstance(true);
ft.add(R.id.scouting_fragment_container, autonFragment, "auton")
.hide(autonFragment);
}
if (teleopFragment == null) {
Log.d("onCreate", "teleopFragment is null!");
teleopFragment = new TeleoperatedScoutingFragment();
teleopFragment.setRetainInstance(true);
ft.add(R.id.scouting_fragment_container, teleopFragment, "teleop")
.hide(teleopFragment);
}
if (postMatchFragment == null) {
Log.d("onCreate", "postMatchFragment is null!");
postMatchFragment = new PostMatchScoutingFragment();
postMatchFragment.setRetainInstance(true);
ft.add(R.id.scouting_fragment_container, postMatchFragment,
"post_match").hide(postMatchFragment);
}
ft.commit();
是否存在;如果他们这样做,我会存储他们的参考;如果没有,我创建一个新实例,如下所示:
Fragment
我遇到的一个问题是,在每次方向更改后,似乎IncrementCounter
实际上都没有被保留,因为我看到调试打印声明它们都是空的。这可能是我的更大问题所致;我不确定。
我试图找出如何在配置更改(特别是轮换)中保持每个onSaveInstanceState()
中存储的数字的值。我在onRestoreInstanceState()
中覆盖了IncrementCounter
和onSaveInstanceState()
。当我旋转设备时,我发现在IncrementCounter
s中的所有Fragment
上都调用了onRestoreInstanceState()
。但是,从不调用相应的IncrementCounter
,并且我的{{1}}没有恢复其状态。处理这样的事情的正确方法是什么?对于这个问题,我几个小时都在我的桌子上敲我的头。
答案 0 :(得分:0)
由于Fragments具有setRetainInstance(true),因此它们不会在旋转时被销毁。活动将被销毁,碎片将被分离,直到创建新的活动。但是,Fragments将再次通过onCreateView()方法,因此您需要恢复其IncrementCounters。
此外,您可以在onSaveInstanceState()中保存状态,然后在onCreate(),onCreateView()和其他几个方法中将其恢复,这些方法都将相同的包作为参数传递。