旋转设备时EditText数据丢失

时间:2012-08-21 06:36:49

标签: android android-edittext orientation onconfigurationchanged

好的,伙计们,我已经完成了。我一直在谷歌搜索过去2天,但我找不到确切的解决方案。每个人都在谈论configChanges和所有那些在我的案例中似乎不起作用的陈词滥调。

我有一个登录屏幕,其中包含2个EditTexts。现在,此登录屏幕具有不同的纵向和横向布局。所以我不得不在layout文件夹中创建一个login.xml,在layout-land文件夹中创建另一个login.xml。为了支持方向更改,我在LoginActivity类中覆盖了onConfigurationChanged()方法。在这个方法中,我调用setContentView(R.layout.login)方法,以便将适当的login.xml设置为每个方向的布局。

毕竟我在清单文件中定义了以下内容:

android:configChanges="orientation|keyboardHidden"

但我仍面对着名的老问题。如果Edittext中有任何文本并且设备已旋转,则该文本将丢失。我不想丢失那个文字。有可能吗?我已经读过我们可以使用onSaveInstanceState(Bundle savedInstanceState)方法来做到这一点,我甚至尝试了它,但它对我不起作用。请帮忙。提前谢谢。

6 个答案:

答案 0 :(得分:5)

使用put方法在onSaveInstanceState中存储值:

protected void onSaveInstanceState(Bundle extra) {
  super.onSaveInstanceState(extra);
  extra.putString("text", "your text here");
}

恢复onCreate中的值:

public void onCreate(Bundle extra) {
  if (extra != null) {
    String value = extra.getString("text");
  }
}

编辑(实际工作的内容):

尝试从清单中删除android:configChanges =“orientation | keyboardHidden”。

祝你好运!

答案 1 :(得分:1)

首先删除您所做的所有onConfigurationChangedconfigChanges=orientation内容 - 此解决方案适用于弱者。然后执行以下操作:

  1. 覆盖onRetainNonConfigurationInstance(),以便返回需要在设备旋转时保存的文本。您可能需要创建一个包含这些值的简单对象 - 例如:

    public class TextObject {
        public String loginText;
        public String passwordText;
    }
    
  2. 在onCreate中,初始化视图后,尝试通过getLastNonConfigurationInstance()从旋转中获取已保存的对象。如果这是您第一次通过onCreate,则会返回null,因此您需要进行空检查。例如:

    TextObject mySavedTextObject = (TextObject) getLastNonConfigurationInstance();
    if(mySavedTextObject!=null) {
      myLoginEditText.setText(mySavedTextObject.loginText);
      myPasswordEditText.setText(mySavedTextObject.passwordText);
    }
    

答案 2 :(得分:0)

https://github.com/jcraane/AndroidBundleState上,您会找到一个非常简单的库来处理状态逻辑。您所要做的就是为您注释字段。

@BundleState( “STATE_NAME”) 私有字符串名称; 在rotationChange之后,库将为您恢复字段中的值。

答案 3 :(得分:0)

只需将此设置为您的登录文本和密码文本

即可

textView.setSaveEnabled(假);

答案 4 :(得分:0)

这可能是非常规的或过大的,但是我发现将数据存储在Application类的捆绑软件中对于片段和活动最为普遍和直观。

在您的Application类中添加:

static class Bundles {
    static Bundle USER_BUNDLE = null;
}

然后在片段或活动中添加:

private String username = "";

@Override
public void onSaveInstanceState(@NonNull Bundle extra) {
    super.onSaveInstanceState(extra);
    EditText txtUsername = v.findViewById(R.id.user_name);
    String username = txtUsername==null ? "" : txtUsername.getText().toString();
    MyApplication.Bundles.USER_BUNDLE = new Bundle();
    MyApplication.Bundles.USER_BUNDLE.putString("User.username", username);     
}

@Override
public void onCreate(Bundle extra) {
    super.onCreate(extra);
    if (MyApplication.Bundles.USER_BUNDLE != null) {
        username = MyApplication.Bundles.USER_BUNDLE.getString("User.username", "");
    }
}

,然后在设置视图组件的任何地方添加以下内容:

EditText txtUsername = v.findViewById(R.id.user_name);
if (txtUsername!=null) txtUsername.setText(username);

添加多个不同类型的值很容易,如果使用片段,甚至可以在它们之间共享数据。

答案 5 :(得分:-2)

在代码即将更改的代码点(时间),执行以下命令:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

但是必须在屏幕改变方向之前放置,例如从设备相机返回到您的应用程序时,经常发生应用程序返回并且无需任何理由再次更改方向。

别忘了给我留言=)

祝你好运。