【问题标题】:android save programmatically created viewsandroid保存以编程方式创建的视图
【发布时间】:2012-12-25 20:00:20
【问题描述】:

我以编程方式创建了一个包含其他视图的 RelativeLayout,并将其添加到 XML 中定义的父级。但是在重新创建活动后,以编程方式创建的所有视图(包括布局)都会消失。我需要一个 SharedPreferences 对象来保存值然后重新创建布局还是有更简单的方法来保存它?

附:所有新创建的视图都会分配一个 id

【问题讨论】:

  • 它们是在 onCreate, onResume, 中创建的吗?
  • 它们是通过单击按钮在 onResume() 中创建的
  • “我需要一个 SharedPreferences 对象来保存这些值吗?” - 当然可以 - 或者其他一些持久存储方式。如果您的程序生成的所有内容没有显式持久化,那么它很容易丢失。 (preference API 除外,它包含透明保存设置的代码。)

标签: android view android-activity android-lifecycle


【解决方案1】:

我是否需要一个 SharedPreferences 对象来保存值然后重新创建布局

您说您正在onResume() 中创建这些小部件。 onResume() 中的代码需要知道需要创建哪些小部件。如果这纯粹是暂时的信息,并且您担心由于屏幕旋转或其他配置更改而被破坏和重新创建的活动,请在活动或片段上使用 onSaveInstanceState() 以从旧的传递有关这些小部件的数据到活动的新实例。另一方面,如果您担心几个月后能够重新创建这些视图,则需要永久存储此信息:SharedPreferences、数据库、其他文件结构、“云”等。

【讨论】:

  • 我们如何将通过编程方式创建的视图存储到 sharedprefs 中的 recyclerview 中?
  • @Kurlicue:您不会“存储视图”。您存储重新创建视图所需的数据。
  • 所以我们存储视图的数据,我们如何保存视图本身而不需要onSaveInstanceState?
  • @Kurlicue:“我们如何保存视图本身”——你没有。新的活动实例再次创建视图,就像它为每个其他视图所做的那样。您使用RecyclerView 的事实并没有改变这一点。
  • 我必须通过什么方法添加视图以便重新创建它们?
【解决方案2】:

我建议你看看Activity.onSaveInstanceState(Bundle):

默认实现通过在具有 id 的层次结构中的每个视图上调用 onSaveInstanceState() 来为您处理大部分 UI 实例状态,并且通过保存当前焦点视图的 id(所有这些都由 onRestoreInstanceState() 的默认实现恢复)。如果您重写此方法以保存每个单独视图未捕获的附加信息,您可能希望调用默认实现 [通过super.onSaveInstanceState()super.onRestoreInstanceState()],否则准备保存每个视图的所有状态自己。

https://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle)

以及我在这里的回答:

How can I assign an ID to a view programmatically?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 2012-10-21
    • 2019-10-10
    • 2017-05-01
    相关资源
    最近更新 更多