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

kAn*_*NaN 102 android onconfigurationchanged android-layout android-orientation

在我的应用程序中我有TextViewEditText.两者都有数据.当屏幕方向更改EditText剩余数据时,TextView数据将被清除.

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

ina*_*ruk 218

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

<TextView 
     ... 
     android:freezesText="true" />
Run Code Online (Sandbox Code Playgroud)

从文档freezesText:

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

  • 为什么默认情况下文本"冻结/保存"不像其他属性(文本选择,光标位置等)?换句话说,在某种情况下,某人实际上_prefer_文本是否被保存? (13认同)
  • @jegesh - 遗憾的是,至少在某些设备上,TextViews不是这种情况(Jellybean) (6认同)
  • AFAIK,给TextView一个id也将解决问题. (4认同)
  • @Gautam我的猜测通常是TextViews是由存储在XML中的静态字符串构建的,在这种情况下,系统要记住这些值是多余的. (3认同)
  • 实际上,一旦您给EditText或TextView一个id,该值将在屏幕旋转事件期间保持不变. (3认同)

Eri*_*vik 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么在onCreate中可用相同的bundle时使用onRestoreInstanceState? (5认同)
  • @slott查看此文档.http://developer.android.com/training/basics/activity-lifecycle/recreating.html这是猜想,但我怀疑这是因为系统会跟踪它是创建新活动还是重新创建旧活动.onRestorySavedInstance仅在极少数情况下被调用 - 由于内存限制导致配置更改和活动破坏. (4认同)

Kev*_*vin 6

Android不会为您处理这类内容.您已手动保存所有数据.

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

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

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

HashMap < String, Object> savedValues 
     = (HashMap<String, Object>)this.getLastNonConfigurationInstance();
Run Code Online (Sandbox Code Playgroud)

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

<activity android:name=".Activity" android:screenOrientation="portrait" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)


JAL*_*JAL 6

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

"据我所知,Android的唯一困扰节能状态对于预期改变的东西.这就是为什么它保存在一个EditText(其中用户可能更改)文本,也许不会保存一个TextView的状态(通常保持静态)"

马克

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

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

android:configChanges= "orientation|keyboardHidden" 
Run Code Online (Sandbox Code Playgroud)

来自文档:

"但是,你的应用程序应该总是能够关闭和其以前的状态重新启动完好,不仅因为有你无法从重新启动您的应用程序阻止,但也是为了处理事件,当用户接收到来电,如其他配置更改打电话然后返回你的应用程序."

JAL