TextView
和一个EditText
。两者都有数据。当屏幕方向改变时,EditText
中的数据保留,但TextView
中的数据会被清除。有人能帮我找到一种保留
TextView
数据的方法吗?TextView
和一个EditText
。两者都有数据。当屏幕方向改变时,EditText
中的数据保留,但TextView
中的数据会被清除。TextView
数据的方法吗?如果你想要强制你的TextView
保存它的状态,你必须添加freezesText
属性:
<TextView
...
android:freezesText="true" />
根据freezesText
的文档:
如果设置了这个属性,文本视图将包括它当前的完整文本以及类似当前光标位置等元数据在内,将其冰冻在其icicle中。默认情况下,此功能被禁用,当文本视图内容未存储在持久存储介质(例如内容提供者)中时,该功能可能是有用的。
@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);
}
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>
1)并非所有具有ID的视图都保存它们的状态。Android小部件具有ID,用户可以更改其状态,似乎在软关闭时保存它们的状态。因此,EditText保存其状态,但TextView在软关闭时不保存其状态。
"据我所知,Android仅会尝试保存预期发生更改的内容的状态。这就是为什么它会保存EditText中的文本(用户可能会更改),而可能不会保存TextView的状态(通常保持静态)" - Mark M
因此,您可以选择在onSaveInstanceState中保存textview的状态,并选择在onCreate中恢复textview的状态。
2)最佳实践是即使声明了“内部”非视图实例状态,也要保存它。
android:configChanges= "orientation|keyboardHidden"
来自文档:
"然而,你的应用程序应该始终能够在关闭和重新启动后保持其先前的状态。不仅因为有其他配置更改可能导致你的应用程序重新启动,而且还要处理事件,例如用户接收到来电然后返回到你的应用程序。"
JAL
在AndroidManifest.xml中修改您的活动以通过将以下内容添加到您的活动/活动来覆盖方向更改行为:
android:configChanges="orientation|keyboardHidden"
它应该看起来像这样:
<activity android:name=".activity.LoginActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
</activity>
将以下内容添加到AndroidManifest.xml文件中
在Activity_Name的位置上填写您的活动名称
<activity android:name="Activity_Name"
android:screenOrientation="sensor"
...
android:configChanges="orientation|keyboardHidden|screenSize">
只需添加
android:configChanges="orientation|screenSize"
当配置更改时,Android 默认会重新启动您的活动。要更改此行为,您应该覆盖 onConfigurationChanged()
方法。此外,您还应该将 android:configChanges
添加到您的清单文件中。
您可以 在这里 阅读更多内容。
我也使用了
android:configChanges="orientation"
但是它没有起作用。
然后我找到了一个解决方案。
请验证您的清单中是否正确包含以下行:
<uses-sdk android:minSdkVersion="11" android:targetSdkVersion="11" />
<uses-sdk android`:minSdkVersion="11" android:targetSdkVersion="15" />`
我一开始是用第二种方式,但当我纠正后,状态得到了保留。