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

时间:2011-03-03 10:47:21

标签: android android-layout android-orientation onconfigurationchanged

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

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

9 个答案:

答案 0 :(得分:217)

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

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

来自freezesText的文档:

  

如果设置,除了元数据(如当前光标位置)之外,文本视图还将在其冻结冰柱内包含其当前完整文本。默认情况下,这是禁用的;当文本视图的内容未存储在诸如内容提供者

之类的持久位置时,它会很有用

答案 1 :(得分: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);
}

答案 2 :(得分: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>

答案 3 :(得分:6)

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

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

Mark M

因此,您可以选择在onSaveInstanceState中保存textview的状态,并且可以选择在onCreate中恢复textview的状态。

2)即使您声明

,最佳做法是保存“内部”非视图实例状态
android:configChanges= "orientation|keyboardHidden" 

来自文档:

“但是,您的应用程序应始终能够关闭并重新启动其先前的状态。不仅因为还有其他配置更改,您无法阻止重新启动应用程序,而且还要处理事件,例如用户接到来电,然后返回您的应用程序。“

JAL

答案 4 :(得分:1)

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

android:configChanges="orientation|keyboardHidden"

它应该看起来像这样:

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

答案 5 :(得分:0)

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

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

这也适用于更改TextField的值。

答案 6 :(得分:0)

只需添加

android:configChanges="orientation|screenSize"

转到您在AndroidManifest.xml中的活动。

答案 7 :(得分:-2)

配置更改时Android会默认重启您的活动。要更改此设置,您应该覆盖onConfigurationChanged()方法。此外,您应该将android:configChanges添加到清单文件中。

您可以阅读更多here

答案 8 :(得分:-7)

我也用过

android:configChanges="orientation"

它不起作用。

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

验证您最熟练的是否正确使用以下行:

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

确保它不会读取类似

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

我在第一时间采用了第二种方式,但是当我纠正它时,状态得到了保留。