【问题标题】:Saving state of the view保存视图状态
【发布时间】:2013-11-29 05:42:59
【问题描述】:

有没有一种简单的方法可以将整个视图组及其数据保存在一起?例如,如果最初我有这个视图,并且在应用程序运行期间,一些视图的背景图像发生了变化,一些视图变得不可见,或者它的文本发生了变化等。如果用户退出应用程序,我如何保存视图的状态?

<RelativeLayout android:layout_width="wrap_content" android:id="@+id/water_room_common"
    android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android"
    >

    <!-- storage layout -->
<View android:id="@+id/gap" android:layout_width="wrap_content"
        android:layout_height="0dip" android:layout_alignParentBottom="true" />

    <RelativeLayout android:id="@+id/storage"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:layout_above="@id/gap" android:layout_marginBottom="10dp"
        android:layout_marginRight="27dp" android:layout_marginLeft="10dp"
        android:layout_toLeftOf="@id/bag" android:orientation="horizontal"
        >

        <ImageButton android:id="@+id/ImageButton02"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_alignTop="@+id/ImageButton01"
            android:layout_marginRight="16dp" android:layout_toLeftOf="@+id/ImageButton01"
            android:background="@drawable/single_square" android:onClick="itemSelected" />

        <ImageButton android:id="@+id/ImageButton03"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_alignTop="@+id/ImageButton01"
            android:layout_centerHorizontal="true" android:layout_marginRight="16dp"
            android:layout_toLeftOf="@+id/ImageButton02" android:background="@drawable/single_square"
            android:onClick="itemSelected"
            />

        <ImageButton android:id="@+id/ImageButton04"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_alignTop="@+id/ImageButton01"
            android:layout_marginRight="16dp" android:layout_toLeftOf="@+id/ImageButton03"
            android:adjustViewBounds="true" android:background="@drawable/single_square"
            android:onClick="itemSelected"
            />

        <ImageButton android:id="@+id/ImageButton05"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_alignTop="@+id/ImageButton01"
            android:layout_marginRight="16dp" android:layout_toLeftOf="@+id/ImageButton04"
            android:adjustViewBounds="true" android:background="@drawable/single_square"
            android:onClick="itemSelected"
            />

        <ImageButton android:id="@+id/ImageButton06"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_alignTop="@+id/ImageButton01"
            android:layout_marginRight="16dp" android:layout_toLeftOf="@+id/ImageButton05"
            android:adjustViewBounds="true" android:background="@drawable/single_square"
            android:onClick="itemSelected"
             />

        <ImageButton android:id="@+id/ImageButton01"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true" android:background="@drawable/single_square"
            android:onClick="itemSelected" 
             />
    </RelativeLayout>

    <ImageButton android:id="@+id/bag" android:layout_width="65dp"
        android:layout_height="65dp" android:layout_alignBottom="@+id/storage"
        android:layout_alignParentRight="true" android:layout_marginRight="10dp"
        android:adjustViewBounds="true"
        android:onClick="bagClicked"/>
    <ImageButton android:id="@+id/left" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:layout_alignLeft="@+id/storage"
        android:layout_centerVertical="true" android:background="@null"
        android:onClick="previousWall" android:src="@drawable/left" />
    <ImageButton android:id="@+id/right" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:layout_alignRight="@id/bag"
        android:layout_centerVertical="true" android:background="@null"
        android:onClick="nextWall" android:src="@drawable/right" />

</RelativeLayout>

【问题讨论】:

    标签: android view savestate


    【解决方案1】:

    看到这个answer。您需要覆盖 onSaveInstanceState 以进行临时更改或覆盖 onPauseonResume 以进行永久更改。

    阅读 API 指南here

    更新

    这是this training的摘要 想象一下这个场景。你有一个记事本应用程序。在主屏幕上,用户有一个最近创建的笔记列表(NoteList Activity),用户可以选择创建新笔记或编辑现有笔记,更改将存储在数据库中。 当用户单击一个项目时,会将另一个活动 (NoteEditActivity) 带到前台。如果用户正在编辑笔记并且 NoteEditActivity 由于某种原因失去焦点(例如,来电或用户只是决定切换到另一个应用程序而没有单击“确认按钮”),则 NoteEditActivity 将从被聚焦到被暂停,然后在它停止后不久。 为防止用户丢失当前编辑,您需要调用 onPause 来保存对数据库的任何更改。现在,如果应用程序处于停止状态 (onStop) 并且用户返回编辑,它将不会通过onCreate,而是通过onResume,这是您想要从用户离开的地方“恢复”的地方。

    这张图片应该进一步解释。 注意每次 Activity 即将成为焦点时如何调用 onResume 而不是 onCreate。

    您可以按照上面的培训更好地理解。

    【讨论】:

    • onSaveInstanceState 和 onRestoreInstanceState 仅在设备因内存不足而终止应用程序或当方向改变时保存,这对我来说不是问题,因为我的应用程序仅是横向的。我不仅需要在瞬态更改中保存视图。至于覆盖 onPause 和 onResume 你有什么确切的建议吗?因为这实际上是我的问题
    • 我想保存视图而不是字符串、int 等数据,而不是用户输入。您知道我们在 setContentView(layoutA) 中定义为布局文件的 xml。在应用程序运行期间,这个 layoutA 发生了变化:它的一些 imagebuttons 改变了背景图像,一些按钮变得不可见,等等。所以我想保存 layoutA 的新版本 onPause() 并在 onResume 上重新创建它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多