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

Posted

技术标签:

【中文标题】Android - 在横向和纵向模式之间切换使 Intent 失去价值【英文标题】:Android - switching between landscape and portrait mode makes Intent lose values 【发布时间】:2010-10-09 17:53:01 【问题描述】:

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

谁能告诉我可能出了什么问题。

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

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

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

请帮忙。

【问题讨论】:

【参考方案1】:

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

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

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

编辑后续问题:

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

【讨论】:

为什么是最后一个问题?重新连接听众重要吗?请告诉我。 :) 是的,因为如果您不重新附加它们,它们仍将附加到不再存在的旧按钮上。 +1 谢谢!在过去的一个小时里,我刚刚陷入了这个错误。我已经开始非常讨厌 Android 开发了!它使琐碎的事情变得复杂。【参考方案2】:

把这个写在你的清单文件中..在哪个活动中你想要这个--

 android:configChanges="orientation|keyboardHidden"

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

android:configChanges="orientation|keyboardHidden|screenSize"

肯定会成功的..

【讨论】:

这是在模拟器中工作的。但在真机上不行。 这也适用于真实设备。确保您已将其添加到出现问题的活动中。【参考方案3】:

试试这个:

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

【讨论】:

【参考方案4】:

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

【讨论】:

添加 this is 到活动标签【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

以上是关于Android - 在横向和纵向模式之间切换使 Intent 失去价值的主要内容,如果未能解决你的问题,请参考以下文章

应该支持纵向和横向模式的 ConstraintLayout - 带有一个按钮来切换全屏

检测“samsung galaxy Android 2.3.5”的方向(横向和纵向模式)的事件

IOS AutoLayout在横向和纵向之间切换时出现约束异常

切换纵向-横向-纵向后丢失媒体查询匹配

Reportlab:如何在纵向和横向之间切换?

iOS 8 - 切换控件后,即使在纵向模式下,旋转也会使状态栏消失