【问题标题】:Save state of custom view inside Fragment在 Fragment 中保存自定义视图的状态
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,但我的问题之一是片段似乎无法在配置更改后继续存在。我是否在做正确的事情来在我的活动重新开始时检索它们?
    猜你喜欢
    • 1970-01-01
    • 2017-01-04
    • 2013-12-06
    • 2011-10-13
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多