20

我正在使用 Intents 在我的 Android 应用程序中的活动之间切换。我将数据放入 Intent 以供下一个活动使用。当我在横向和纵向模式之间切换手机时,从意图传递的值丢失并且我得到 NullPointerException。

有人可以告诉我可能出了什么问题。

有很多代码可以完全发布。但是如果有人需要查看代码的特定部分,我可以在这里发布。

编辑
我解决了未保存状态的问题。但我面临的另一个问题是屏幕上的按钮在方向改变后都不起作用。按下按钮时,我在 LogCat 中收到此警告

02-25 23:07:49.190: WARN/WindowManager(58): No window to dispatch pointer action 0

请帮忙。

4

6 回答 6

25

当您切换方向时,将重新创建活动并调用 onCreate,因此您必须使用捆绑包保存当前状态并在方向更改后恢复。如果您只有一个带有 TextView 的应用程序并且您输入文本并更改方向,您可以看到这一点。如果您为 onCreate 捆绑您的状态,则可以遏制这种情况。这可能也是为什么在方向改变后你有一个 NullPointer 的原因。这很烦人,但我们必须忍受。

一系列定向教程的链接,尤其是第一个教程,应该可以帮助您准确了解正在发生的事情以及如何成功地保持当前状态。

更新:还有一篇关于 SO Activity restart on rotation Android的帖子处理几乎相同的事情。

编辑后续问题:

您是否在方向更改后重新附加了单击处理程序?

于 2009-02-25T05:23:11.080 回答
9

把它写在你的清单文件中……你想要这个在哪个活动中——

 android:configChanges="orientation|keyboardHidden"

已编辑:将此用于新的 API 版本——

android:configChanges="orientation|keyboardHidden|screenSize"

肯定会起作用的。。

于 2012-05-10T09:17:21.513 回答
5

试试这个:

@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);
   ...
}
于 2009-07-13T09:33:21.877 回答
3

可以使用“orientation”值声明一个属性 android:configChanges,这将阻止 Activity 重新启动。相反,活动保持运行并调用其 onConfigurationChanged() 方法。

于 2011-03-20T14:21:17.597 回答
1

在你的清单中声明< android:configChanges="orientation|keyboardHidden"/>。这使您可以自己管理方向/键盘可见性的更改。当然,你不需要重写回调方法来管理它。

于 2012-10-22T06:03:03.073 回答
0

您好我也遇到了这个问题。为我解决的问题是:

@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");
}

那么你可以确定对象不为空。

于 2015-10-29T17:24:02.793 回答