我有一个登录屏幕,其中包含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)方法来做到这一点,我甚至尝试了它,但它对我不起作用。请帮忙。提前谢谢。
答案 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)
首先删除您所做的所有onConfigurationChanged
和configChanges=orientation
内容 - 此解决方案适用于弱者。然后执行以下操作:
覆盖onRetainNonConfigurationInstance(),以便返回需要在设备旋转时保存的文本。您可能需要创建一个包含这些值的简单对象 - 例如:
public class TextObject {
public String loginText;
public String passwordText;
}
在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);
但是必须在屏幕改变方向之前放置,例如从设备相机返回到您的应用程序时,经常发生应用程序返回并且无需任何理由再次更改方向。
别忘了给我留言=)
祝你好运。