在Fragment中保存自定义视图的状态

时间:2013-11-16 02:55:00

标签: android android-fragments android-custom-view

首先,一些背景资料。我有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()中覆盖了IncrementCounteronSaveInstanceState()。当我旋转设备时,我发现在IncrementCounter s中的所有Fragment上都调用了onRestoreInstanceState()。但是,从不调用相应的IncrementCounter,并且我的{{1}}没有恢复其状态。处理这样的事情的正确方法是什么?对于这个问题,我几个小时都在我的桌子上敲我的头。

1 个答案:

答案 0 :(得分:0)

由于Fragments具有setRetainInstance(true),因此它们不会在旋转时被销毁。活动将被销毁,碎片将被分离,直到创建新的活动。但是,Fragments将再次通过onCreateView()方法,因此您需要恢复其IncrementCounters。

此外,您可以在onSaveInstanceState()中保存状态,然后在onCreate(),onCreateView()和其他几个方法中将其恢复,这些方法都将相同的包作为参数传递。