Android - 在横向和纵向模式之间切换会使Intent失去价值

时间:2009-02-25 05:10:28

标签: android android-orientation landscape-portrait

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

有人可以告诉我可能出现的问题。

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

修改
我解决了国家没有得救的问题。但我遇到的另一个问题是,在方向改变后屏幕上没有任何按钮工作。按下按钮,我在LogCat中收到此警告

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

请帮忙。

6 个答案:

答案 0 :(得分:25)

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

This链接了一系列的入门教程,特别是this first one应该可以帮助您准确了解正在发生的事情以及如何成功维护当前状态。

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

编辑后续问题:

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

答案 1 :(得分:9)

将此内容写入您的清单文件中。您希望在哪个活动中使用

 android:configChanges="orientation|keyboardHidden"

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

android:configChanges="orientation|keyboardHidden|screenSize"

肯定会起作用..

答案 2 :(得分: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);
   ...
}

答案 3 :(得分:3)

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

答案 4 :(得分:1)

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

答案 5 :(得分: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");
}

然后你可以确定这些对象不是空的。