如何在方向更改时保留EditText数据?

Yog*_*ani 29 android orientation android-layout android-edittext

我有一个登录屏幕,其中包含2个用于用户名和密码的EditTexts.我的要求是,在方向更改时,EditText中的输入数据(如果有)应保持原样,并且还应绘制新布局.我有2个布局xml文件 - 一个在布局文件夹中,另一个在layout-land文件夹中.我正在尝试实现以下两种方法,但它们都不是完美的:

(1)configChanges:keyboardHidden -在这种方法中,我没有在清单文件中的configChanges中提供"orientation".所以我在onCreate()和onConfigurationChanged()方法中都调用了setContentView()方法.它符合我的要求.布局已更改,EditTexts中的输入数据也保持不变.但它有一个很大的问题:

当用户单击"登录"按钮时,将显示ProgressDialog,直到收到服务器响应.现在,如果用户在ProgressDialog运行时旋转设备,则应用程序崩溃.它显示一个异常,说"视图无法附加到窗口".我试图使用onSaveInstanceState处理它(它会在方向更改时被调用)但应用程序仍然崩溃.

(2)configChanges:orientation | keyboardHidden -在这种方法中,我在清单中提供"方向".所以现在我有两个场景:

(a)如果我在onCreate()和onConfigurationChanged()中调用setContentView()方法,则相应地更改Layout,但EditText数据会丢失.

(b)如果我在onCreate()中调用setContentView()方法,而不是onConfigurationChanged(),则EditText数据不会丢失,但布局也不会相应地更改.

在这种方法中,甚至没有调用onSaveInstanceState().

所以我处在一个非常令人生畏的境地.有没有解决这个问题的方法?请帮忙.Thanx提前.

Yal*_* T. 81

默认情况下,Edittext在更改方向时保存自己的实例.

确保2个Edittexts具有唯一ID,并且在两个布局中具有相同的ID.

这样,他们的状态应该被保存,你可以让Android处理方向的变化.

如果您正在使用片段,请确保它还具有唯一ID,并且在重新创建活动时不会重新创建它.

  • 如果您使用ListView怎么办?你运气不好,因为每件商品都没有唯一的ID吗? (3认同)

kar*_*arn 33

更好的方法是让android处理方向更改.Android将自动从正确的文件夹中获取布局并将其显示在屏幕上.您需要做的就是在onSaveInsanceState()方法中保存编辑文本的输入值,并使用这些保存的值初始化onCreate()方法中的编辑文本.
以下是如何实现这一目标:

@Override
protected void onCreate (Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login_screen);
    ...
    ...
    String userName, password;
    if(savedInstanceState!=null)
    {
        userName = savedInstanceState.getString("user_name");
        password= savedInstanceState.getString("password");
    }

    if(userName != null)
        userNameEdtTxt.setText(userName);
    if(password != null)
        passEdtTxt.setText(password);
}
Run Code Online (Sandbox Code Playgroud)

>

@Override
    protected void onSaveInstanceState (Bundle outState)
    {
        outState.putString("user_name", userNameEdtTxt.getText().toString());
        outState.putString("password",  passEdtTxt.getText().toString());
    }
Run Code Online (Sandbox Code Playgroud)


小智 9

在onConfigurationChanged方法中,首先获取全局变量中两个编辑文本的数据,然后调用setContentView方法.现在将已保存的数据再次设置为编辑文本.


Car*_*arí 8

给元素一个 id,Android 会为你管理它。

android:id="@id/anything"
Run Code Online (Sandbox Code Playgroud)