屏幕旋转后恢复TextView的状态?


Answers:


221

如果要强制TextView保存状态,则必须添加freezesText属性:

<TextView 
     ... 
     android:freezesText="true" />

从以下文档freezesText

如果设置,则文本视图除了其当前光标位置等元数据外,还将在其冻结的冰柱内包括其当前的完整文本。默认情况下,它是禁用的;当文本视图的内容未存储在诸如内容提供者之类的持久位置时,此功能很有用


13
为什么默认情况下文本不像其他属性(文本选择,光标位置等)那样“冻结/保存”?换句话说,在哪种情况下,有人实际上希望保存文本?
戈塔姆

3
@Gautam我的猜测是,TextView通常是由存储在XML中的静态字符串构建的,在这种情况下,系统记住值是多余的。
anderspitman 2014年

3
实际上,一旦为EditText或TextView指定了ID,该值将在屏幕旋转事件期间保持不变。
DoctorFox

7
@jegesh -不幸的是,这不是至少在某些设备上TextViews的情况下(杰利贝恩)
博马赫特布劳

1
对我不起作用,至少一个API 17设备不
抗体

28

为了保留有关方向更改的数据,您需要实现两种方法:

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    // Read values from the "savedInstanceState"-object and put them in your textview
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    // Save the values you need from your textview into "outState"-object
    super.onSaveInstanceState(outState);
}

5
当onCreate中有相同的捆绑包时,为什么要使用onRestoreInstanceState?
老虎机

4
@slott查看此文档。developer.android.com/training/basics/activity-lifecycle/…这是推测,但我怀疑是因为系统会跟踪是在创建新活动还是在重新创建旧活动。仅在少数情况下才会调用onRestorySavedInstance-由于内存限制而导致配置更改和活动破坏。
Gusdor 2012年

6

1)并非所有具有ID的视图都保存其状态。具有状态可以由用户更改其状态的ID的Android小部件似乎可以将其状态保存为轻击。因此,EditText保存其状态,但TextView不会在软终止时保存其状态。

“ AFAIK,Android仅会为预期会更改的内容保存状态。这就是为什么它将文本保存在EditText中(用户可能会更改)的原因,并且可能不会保存TextView的状态(通常保持静态) )”

马克·M

因此,您可以选择将文本视图的状态保存在onSaveInstanceState中,也可以选择将文本视图的状态保存在onCreate中。

2)最佳做法是保存“内部”非视图实例状态,即使您声明

android:configChanges= "orientation|keyboardHidden" 

从文档:

“但是,您的应用程序应该始终能够关闭并重新启动,并保持其先前的状态不变。这不仅是因为您无法阻止其他配置更改而无法重新启动应用程序,而且还可以处理诸如用户收到传入消息之类的事件电话,然后返回到您的应用程序。”

日航


6

Android无法为您处理这类事情。您已经手动保存了所有数据。

您可以在活动中使用以保存值

@Override
    public Object onRetainNonConfigurationInstance() {
        HashMap<String, Object> savedValues = new HashMap<String, Object>();
        savedValues.put("someKey", someData);           
        return savedValues;
    }

并在活动的oncreate方法中使用类似的方法来加载保存的对象

HashMap < String, Object> savedValues 
     = (HashMap<String, Object>)this.getLastNonConfigurationInstance();

您还可以为活动选择禁用方向更改

<activity android:name=".Activity" android:screenOrientation="portrait" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>
</activity>

无法覆盖android.support.v4.app.fragmentActivity中的onRetainNonConfigurationInstance();覆盖的方法是最终的!
Akash Dubey

1

通过将AndroidManifest.xml中的活动添加到您的一个或多个活动中,以覆盖方向更改行为,从而对其进行修改:

android:configChanges="orientation|keyboardHidden"

它看起来应该像这样:

    <activity android:name=".activity.LoginActivity"
              android:configChanges="orientation|keyboardHidden"
              android:label="@string/app_name">
    </activity>

27
通常,文档中不建议采用这种方法:“应避免使用此属性,而只能将其用作最后一种。请阅读处理运行时更改 ...”
idbrii 2011年

1

将它们添加到AndroidManifest.xml
中将您的活动名称放置在Activity_Name的位置

<activity android:name="Activity_Name"
        android:screenOrientation="sensor"
        ...
        android:configChanges="orientation|keyboardHidden|screenSize">

这也适用于更改TextField的值。


1

只需添加

android:configChanges="orientation|screenSize"

您在AndroidManifest.xml中的活动。



-7

我也用过

android:configChanges="orientation"

它没有用。

但是后来我找到了解决方案。

验证是否最正确地包含以下行:

<uses-sdk android:minSdkVersion="11" android:targetSdkVersion="11" />

确保它不会读取类似

<uses-sdk android`:minSdkVersion="11" android:targetSdkVersion="15" />`

我以第二种方式获得了第一名,但是当我更正它时,状态得以保留。


1
这是完全不同的事情。目标SDK是为了使您的应用与大多数Android OS兼容。这不是一个答案,从某种意义上说,这可能对您有用,但这不是一个适当的解决方案。
Rohan Kandwal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.