【发布时间】:2013-11-29 14:42:04
【问题描述】:
首先,一些背景信息。我有一个Activity 托管几个Fragments;它们被隐藏并显示,因此一次只能看到一个Fragment。每个Fragment 托管几个我称之为IncrementCounters 的自定义Views。这些视图会显示一个数字,并在点击时将该数字加 1。
每个Fragments 在我的Activity 中创建时都调用了setRetainInstance(true)。创建Activity 时,我检查Fragments 是否存在;如果他们这样做,我会存储对他们的引用;如果没有,我创建一个新实例,如下所示:
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();
我遇到的一个问题是,在每次方向更改后,Fragments 似乎实际上并没有被保留,就像我每次看到调试打印表明它们都为空一样。这可能与我更大的问题有关;我不确定。
我试图弄清楚如何在配置更改(特别是轮换)中保持每个IncrementCounter 中存储的数字的值。我在IncrementCounter 中覆盖了onSaveInstanceState() 和onRestoreInstanceState()。当我旋转我的设备时,我看到onSaveInstanceState() 在我的Fragments 中的所有IncrementCounters 上被调用。但是,从未调用过相应的onRestoreInstanceState(),并且我的IncrementCounters 没有恢复其状态。处理这样的事情的正确方法是什么?为了这个问题,我已经把头撞在桌子上好几个小时了。
【问题讨论】:
标签: android android-fragments android-custom-view