【问题标题】:Android view turn off implicit state retaining for some viewAndroid视图关闭某些视图的隐式状态保留
【发布时间】:2016-11-25 18:58:36
【问题描述】:

我有 custom View 在同一个活动中多次动态添加。

每个自定义视图实例都有一个TextView 子级。 TextView 有它的 ID 并且对于每个视图实例都是相同的。

对于每个自定义视图实例,我在创建活动时为TextView 设置了不同的Text。 当我旋转屏幕时,Activity 被重新创建,但现在每个 TextView 都显示相同的 Text(文本与最后一个实例的文本相同)。

这是因为实例状态的保存和恢复会自动保存一些信息,但这些信息显然与 ID 相关联,在我的情况下会产生问题。

有没有办法禁用特定视图的自动状态保留?

是否有属性或设置或一些解决方法?

【问题讨论】:

    标签: java android


    【解决方案1】:

    您可以使用View.setSaveEnabled (boolean enabled) 方法。

    也可以通过xml 使用saveEnabled 属性android:saveEnabled="false" 禁用自动状态保存

    【讨论】:

    • 救命稻草回答!太好了!
    • 在我的情况下也有助于防止 RecyclerView 在方向更改时保存其 StaggeredGridLayoutManager 状态,并在使用错误的跨度计数恢复时因 ArrayIndexOutOfBoundsException 而崩溃。
    • 还解决了“IllegalArgumentException: Wrong state class”的旋转问题,当nestedScrollView 在手机布局和平板电脑布局中具有相同的 ID 时,另一个布局类型正在使用相同的 ID,不知道虽然有缺点。
    • 您也可以使用View.setSaveFromParentEnabled(boolean enabled) 禁用整个视图层次结构的状态保存,例如您可以在根元素上设置它并完全禁用保存。
    【解决方案2】:

    如果您需要为所有层次结构应用 setSaveEnabled:

        public static void SaveEnableViewAndChildren(this View view, bool val)
        {
            if (view == null)
                return;
            view.SaveEnabled = val;
    
            var viewGroup = view as ViewGroup;
            if (viewGroup == null)
                return;
            for (int i = 0; i < viewGroup.ChildCount; i++)
                SaveEnableViewAndChildren(viewGroup.GetChildAt(i), val);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多