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) 方法来做到这一点,我什至也尝试过,但它对我不起作用。请帮忙。提前致谢。

4

6 回答 6

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"。

祝你好运!

于 2012-08-21T06:43:29.450 回答
1

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

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

    public class TextObject {
        public String loginText;
        public String passwordText;
    }
    
  2. 在 onCreate 中,初始化视图后,尝试通过getLastNonConfigurationInstance(). 如果这是您第一次经历,这将返回 null onCreate,因此您需要进行 null 检查。例子:

    TextObject mySavedTextObject = (TextObject) getLastNonConfigurationInstance();
    if(mySavedTextObject!=null) {
      myLoginEditText.setText(mySavedTextObject.loginText);
      myPasswordEditText.setText(mySavedTextObject.passwordText);
    }
    
于 2012-08-21T07:08:47.687 回答
0

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

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

于 2014-03-21T15:10:05.700 回答
0

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

textView.setSaveEnabled(false);

于 2014-11-25T08:42:18.453 回答
0

这可能是非常规的或矫枉过正的,但我发现在应用程序类中以包的形式存储数据对于片段和活动最普遍成功和直观。

在您的应用程序类中添加:

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

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

于 2020-10-22T10:11:54.800 回答
-3

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

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

但这必须在屏幕改变方向之前放置,例如,当从设备相机返回到您的应用程序时,应用程序经常会无缘无故地返回并再次更改方向。

并且不要忘记标记我=)

祝你好运。

于 2015-02-06T11:30:11.923 回答