108

在我的应用程序中,我有TextViewEditText. 两者都有数据。当屏幕方向改变时,数据EditText仍然存在,但TextView数据被清除。

有人可以帮我找到一种方法来保留数据TextView吗?

4

9 回答 9

229

如果你想强制你TextView保存它的状态,你必须添加freezesText属性:

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

从文档freezesText

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

于 2011-05-23T12:28:01.007 回答
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);
}
于 2011-03-03T10:52:43.923 回答
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>
于 2011-03-03T12:31:09.440 回答
6

1) 并非所有具有 ID 的视图都会保存其状态。带有 ID 的 Android 小部件,其状态可由用户更改,似乎在软杀时保存其状态。所以 EditText 保存了它的状态,但是 TextView 在软杀时不会保存它的状态。

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

马克 M

所以你可以选择在onSaveInstanceState 中保存textview 的状态,你可以选择在onCreate 中恢复textview 的状态。

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

android:configChanges= "orientation|keyboardHidden" 

从文档:

“但是,您的应用程序应该始终能够在其先前状态完好无损的情况下关闭和重新启动。不仅因为您无法阻止重新启动应用程序的其他配置更改,而且还为了处理事件,例如当用户收到传入的电话,然后返回到您的应用程序。”

日航

于 2011-03-03T17:50:51.037 回答
1

修改 AndroidManifest.xml 中的活动以通过将其添加到您的活动/活动来覆盖方向更改行为:

android:configChanges="orientation|keyboardHidden"

它应该看起来像这样:

    <activity android:name=".activity.LoginActivity"
              android:configChanges="orientation|keyboardHidden"
              android:label="@string/app_name">
    </activity>
于 2011-03-03T10:50:10.310 回答
1

将这些添加到 AndroidManifest.xml
将您的活动名称放在 Activity_Name 的位置

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

这也适用于更改 TextField 的值。

于 2018-04-05T21:04:45.443 回答
1

只需添加

android:configChanges="orientation|screenSize"

到 AndroidManifest.xml 中的 Activity。

于 2019-01-20T19:54:20.110 回答
-2

默认情况下,当配置更改时,Android 会重新启动您的活动。要改变这一点,你应该重写onConfigurationChanged()方法。此外,您应该添加android:configChanges到清单文件中。

你可以在这里阅读更多。

于 2011-03-03T10:49:39.353 回答
-7

我也用过

android:configChanges="orientation"

它没有用。

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

验证您的maniest 中是否正确包含以下行:

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

确保它没有读到类似的东西

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

我首先采用第二种方式,但是当我更正它时,状态得到了保留。

于 2012-07-13T20:31:28.720 回答