【问题标题】:Saving the state of multiple views in a fragment将多个视图的状态保存在一个片段中
【发布时间】:2014-02-01 18:19:14
【问题描述】:

我有一个片段,有几个视图。其中两个是自定义的:我们称它们为FrameLayoutAFrameLayoutB。问题是FrameLayoutB 在我返回片段时没有保存它的状态。

没有onSaveInstanceState/onRestoreInstanceState/setRetainInstance/onRetainNonConfigurationInstance/getLastNonConfigurationInstance方法被调用/重载,FrameLayoutA/FrameLayoutB类和fragment的类中也没有。

找不到保存一个视图状态而另一个视图状态未保存的原因。有任何想法吗?我错过了什么吗?

更新:

onCreateView() 停止调试器,显然我恢复的值在inflater->mChildFragment->mSavedViewStateinflater 的类型为 org.holoeverywhere.LayoutInflater。仍在寻找为什么某些视图被保存但其他视图没有保存的答案。

更新:

所以有两个我的自定义视图,它们在其中膨胀了相同的布局。布局具有声明了 id 的 EditTexts。所以View.dispatchRestoreInstanceState() 正在从第二个视图中的值恢复两个视图上的值。所以当我回到片段时,我的两个自定义视图都有相同的值。

【问题讨论】:

  • 确保你的view-s ID是唯一的,也许你有相同的ID并且view会覆盖之前保存的值。
  • 进一步调试并注意到这些值保存在inflater中。更新问题。
  • 嗯,我想,这就是根本原因:我对FrameLayoutB 有两个视图,而第二个视图有不同的状态,所以我填写的b1 字段不可见在b2 中,所以这应该是b1 视图状态被空b2 状态覆盖的原因。很快就会确认。
  • 好的。看起来我找到了。我不得不手动保存状态,但禁用它的子视图的自动状态保存。很快就会发布答案。

标签: android android-fragments android-edittext savestate


【解决方案1】:

如果你想改变片段,你可以这样做:

getSupportFragmentManager().beginTransaction()
                .addToBackStack(Fragment.class.getName())
                .**add**(R.id.content_fragment, fragment, Fragment.class.getName())
                .commit();

调用“添加”而不是“替换”,当您返回原始片段时,片段的状态就可以了。

这对我有用,希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 2017-05-27
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2019-04-10
    相关资源
    最近更新 更多