Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 旋转设备时EditText数据丢失_Android_Android Edittext_Orientation_Onconfigurationchanged - Fatal编程技术网

Android 旋转设备时EditText数据丢失

Android 旋转设备时EditText数据丢失,android,android-edittext,orientation,onconfigurationchanged,Android,Android Edittext,Orientation,Onconfigurationchanged,好了,伙计们,我受够了。过去两天我一直在谷歌上搜索,但我找不到确切的解决办法。每个人都在谈论配置的变化和所有那些陈词滥调的东西,这些东西在我的情况下似乎不起作用 我有一个由2个文本组成的登录屏幕。现在,这个登录屏幕的纵向和横向布局都不同了。因此,我必须在layout文件夹中创建一个login.xml,在layout land文件夹中创建另一个login.xml。为了支持方向更改,我重写了LoginActivity类中的onConfigurationChanged()方法。在这个方法中,我调用se

好了,伙计们,我受够了。过去两天我一直在谷歌上搜索,但我找不到确切的解决办法。每个人都在谈论配置的变化和所有那些陈词滥调的东西,这些东西在我的情况下似乎不起作用

我有一个由2个文本组成的登录屏幕。现在,这个登录屏幕的纵向和横向布局都不同了。因此,我必须在layout文件夹中创建一个login.xml,在layout land文件夹中创建另一个login.xml。为了支持方向更改,我重写了LoginActivity类中的onConfigurationChanged()方法。在这个方法中,我调用setContentView(R.layout.login)方法,以便为每个方向设置适当的login.xml作为布局

在此之后,我还在清单文件中定义了以下内容:

android:configChanges="orientation|keyboardHidden"

但我仍然面临着著名的老问题。如果Edittext中有任何文本,且设备旋转,则该文本将丢失。我不想丢失那条短信。有没有可能?我已经读到,我们可以使用onSaveInstanceState(Bundle savedInstanceState)方法来实现它,我甚至也尝试过,但它对我不起作用。请帮忙。提前感谢。

使用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”


祝你好运

使用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”


祝你好运

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

  • 重写OnRetainOnConfigurationInstance(),以便它返回需要在设备旋转时保存的文本。您可能需要创建一个包含这些值的简单对象,例如:

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

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

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

  • 重写OnRetainOnConfigurationInstance(),以便它返回需要在设备旋转时保存的文本。您可能需要创建一个包含这些值的简单对象,例如:

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

    TextObject mySavedTextObject = (TextObject) getLastNonConfigurationInstance();
    if(mySavedTextObject!=null) {
      myLoginEditText.setText(mySavedTextObject.loginText);
      myPasswordEditText.setText(mySavedTextObject.passwordText);
    }
    
  • 在上,您可以找到一个非常简单的库,为您处理状态逻辑。您所要做的就是为字段添加注释

    @BundleEstate(“州名称”) 私有字符串名称; 旋转更改后,库将为您恢复字段中的值。

    在上,您可以找到一个非常简单的库,为您处理状态逻辑。您所要做的就是为字段添加注释

    @BundleEstate(“州名称”) 私有字符串名称;
    在轮换更改后,库将为您恢复字段中的值。

    只需为您的登录文本和密码文本设置此值即可


    textView.setSaveEnabled(false)

    只需将其设置为登录文本和密码文本

    textView.setSaveEnabled(false)

    在代码中方向即将改变的点(时间),实现以下操作:

    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    
    但这必须在屏幕改变方向之前进行,例如,当从设备摄像头返回应用程序时,应用程序通常会在没有任何原因的情况下返回并再次改变方向

    别忘了标记我=)

    祝你好运

    在代码中方向即将改变的点(时间),实现以下操作:

    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    
    但这必须在屏幕改变方向之前进行,例如,当从设备摄像头返回应用程序时,应用程序通常会在没有任何原因的情况下返回并再次改变方向

    别忘了标记我=)


    祝你好运

    这可能是非常规的或过分的,但我发现在应用程序类的捆绑包中存储数据对于片段和活动来说是最普遍成功和直观的

    在应用程序类中添加:

    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);
    

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

    这可能是非常规的或过分的,但我发现将数据存储在应用程序类的捆绑包中对于片段和活动来说是最普遍成功和直观的

    在应用程序类中添加:

    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);
    

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

    这正是我一直在做的事情,但对我来说不起作用。您不应该在onConfigurationChanged()中调用setContent()方法,因为您为此创建了layout和layout land文件夹。内容将自动更改。在这种情况下,数据仍然存在,但布局不会相应更改。请尝试删除android:configChanges=“orientation | keyboardHidden”清单中的from manifest.setting configChanges=方向阻止应用程序在方向更改时重新创建。这正是我一直在做的,但对我来说不起作用。并且