Android - 横向和纵向模式之间切换使 Intent 失去值
-
06-09-2019 - |
题
我正在使用 Intents 在 Android 应用程序中的活动之间切换。我将数据放入 Intent 中以供下一个活动使用。当我在横向和纵向模式之间切换手机时,从意图传递的值会丢失,并且会出现 NullPointerException。
有人可以告诉我可能出了什么问题吗?
有很多代码可以完整发布。但如果有人需要查看代码的特定部分,我可以将其发布在这里。
编辑
我解决了状态未保存的问题。但我面临的另一个问题是,方向改变后,屏幕上的按钮都不起作用。按下按钮时,我在 LogCat 中收到此警告
02-25 23:07:49.190: WARN/WindowManager(58): No window to dispatch pointer action 0
请帮忙。
解决方案
当您切换方向时,将重新创建 Activity 并调用 onCreate,因此您必须使用捆绑包来保存当前状态并在方向更改后恢复。如果您只有一个带有 TextView 的应用程序并且输入文本并更改方向,则可以看到此操作的实际效果。如果将 onCreate 的状态捆绑起来,就可以遏制这种情况。这可能也是方向改变后出现 NullPointer 的原因。这真是太烦人了,但我们必须忍受。
这 一系列定向教程的链接和 这第一个 特别是应该帮助您准确了解正在发生的事情以及如何成功维持当前状态。
更新:SO 上也有一个帖子 Android 轮流重启 Activity 处理几乎相同的事情。
编辑后续问题:
方向更改后您是否重新附加了单击处理程序?
其他提示
写这在您的清单file..in -
android:configChanges="orientation|keyboardHidden"
编辑::使用这一个新的API版本 -
android:configChanges="orientation|keyboardHidden|screenSize"
当然将工作..
尝试这种情况:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(SOME_KEY, "blah blah blah");
}
@Override
public void onCreate(Bundle savedInstanceState) {
...
somevalue = savedInstanceState.getString(SOME_KEY);
...
}
它可以声明的属性机器人:与“方向”的值configChanges,这将防止从正在重新启动的活性。取而代之的是,活动保持运行及其onConfigurationChanged()方法被调用。
在您的清单声明< android:configChanges="orientation|keyboardHidden"/>
。这允许您自行管理方向/键盘能见度的变化。当然,你并不需要重写回调方法进行管理。
您好我也遇到了这个问题。 什么固定对我来说是:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putString("Username", mUsername);
savedInstanceState.putString("Password", mPassword);
savedInstanceState.putString("UserID", mUserID);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
,然后在的onCreate():
if (savedInstanceState == null) {
Bundle extras = getIntent().getExtras();
if(extras == null) {
mUsername = "?";
mPassword = "?";
mUserID = "?";
} else {
mUsername = extras.getString("Username");
mPassword = extras.getString("Password");
mUserID = extras.getString("UserID");
}
} else {
mUsername = (String) savedInstanceState.getSerializable("Username");
mPassword = (String) savedInstanceState.getSerializable("Password");
mUserID = (String) savedInstanceState.getSerializable("UserID");
}
那么你可以肯定的对象不是空。