【问题标题】:Passing value from second activity to main throws NPE将价值从第二个活动传递到主要活动抛出 NPE
【发布时间】:2015-10-01 17:14:51
【问题描述】:

当我在第二个 Activity 中按下按钮时,intent 会向 MainActivity 发送一个字符串。它在 onClick 方法中:

        Intent intent = new Intent(this, MainActivity.class);
        String wynik = "clear";
        intent.putExtra("clearList", wynik);

和主要活动,在 onCreate 方法中:

 Intent intent2 = getIntent();
    wynik = intent2.getStringExtra("clearList");
    if (wynik.equals("clear")) {

        tempLukasz = 0;
        tempMarcelina = 0;
        tempKarolina = 0;
        foodCategorySum = 0;
        catCategorySum = 0;
        othersCategorySum = 0;
        lukaszJedzenie = 0;
        lukaszKot = 0;
        lukaszInne = 0;
        marcelinaJedzenie = 0;
        marcelinaKot = 0;
        marcelinaInne = 0;
        karolinaJedzenie = 0;
        karolinaKot = 0;
        karolinaInne = 0;
        newPayments.clear();
        wynik = "";
    }

所以当 MainActivity 收到这个“清除”消息时,它应该将我的数字设置为 0 并清除列表。 Pic.1 是我的主要活动窗口的示例:

在第二张图片中,我希望在第二个活动中按下 AFTER 按钮

不幸的是它不起作用:这一行抛出 NullPointerException:

 if (wynik.equals("clear")) {

任何想法我在哪里犯了错误?我认为检查 if ( getIntent() != null ) 会解决这个问题,或者只是用 try-catch 包围我的 IF 类,但它也不起作用。

【问题讨论】:

  • 请发布您用于发送和接收意图的确切代码
  • 为什么需要从第二个活动中调用 MainActivity,因为按下后退按钮仍然会带你回到 MainActivity。
  • 它不是后退按钮,它是第二个活动中的一个按钮,它将一些数据存储在第二个活动的 ListView 中,并且在它显示数据后我想“重置”第一个活动,以便每个number 和 list 被置零
  • 尝试探索 startActivityForResult 而不是在 SecondActivity 中再次启动 MainActivity。此外,当您说您获得 NPE 时,您也应该发布异常跟踪,否则将无法提供帮助。
  • 您可能希望使用 startActivityForResult,正如 Sharj 所提到的。 Here is an answer I wrote up with an example

标签: android android-intent


【解决方案1】:

仅检查intent是否为null还不够,还需要检查String本身是否为null。

来自 developer.android.com:
返回
之前使用 putExtra() 添加的项目的值,如果未找到 String 值,则为 null

来源:http://developer.android.com/reference/android/content/Intent.html#getStringExtra(java.lang.String)

所以改成:

if (intent2 != null && wynik != null && wynik.equals("clear")) {
    ... 
}

【讨论】:

  • 我尝试了这段代码,它对 NPE 有帮助,但代码没有被执行 - 值没有重置,当我试图在这里举杯时它没有出现)。
【解决方案2】:

在此尝试中我注意到奇怪的主要事情是应该在启动时发生空异常,另一件事是意图,当用于向后传递值时,我们倾向于使用 onActivityResult。

这样设置你的意图时

Intent intent = new Intent(this, MainActivity.class);
String wynik = "clear";
intent.putExtra("clearList", wynik);

我们将结果设置为

setResult(x, intent);

然后我们通过调用 onActivityResult 在主类中接收到意图

 @Override 
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
      //dosomething with intent
 }

但还需要记住将调用第二个活动的意图设置为 startActivityForResult(intent, x);

【讨论】:

  • 我不确定我是否理解正确。所以我应该写Intent intent2 = new Intent(this, MainActivity.class); String wynik = "clear"; intent2.putExtra("clearList", wynik); setResult(10, intent2);,我应该在哪里使用 onActivityResult 方法?我的 clean-list/reset-values 代码应该在 MainActivity 的“onActivityResult”中,但我应该在哪里调用它?
  • 您有权将 onActivityResult 放在您的 mainactivity 中,并且在使用 startActivityForResult 启动意图并且该视图被关闭时会自动调用它。
  • 但我不想从 SecondaryActivity 的任何地方启动 MainActivity 以获得结果。我想启动 MainActivity 的唯一时间是当我按下后退按钮时,这比使用我的 CALCULATE 按钮后发生的频率更高(这应该使 mainactivity 重置的值)
【解决方案3】:

问题就像 zulkarnain 说的...... 尝试在第二个活动中创建一个静态布尔值并将其命名为例如:“check_for_activity”(将其命名为您想要的任何名称) 然后在 put extra .. 将“check_for_activity”设置为 true .. 并在主要活动中..在 getIntent 行之前..键入: if(secondActivity.check_for_activity == true ){ // 将用于从第二个活动中获取值的代码放在这里 }

试试吧,它可能会奏效:) (y)

【讨论】:

  • 我在第二个活动和主要活动中设置了一个静态布尔值,我使用 if (boolean == true) 但它没有达到我想要的效果。它执行代码,但我认为它不在适当的位置,因为即使这些 valeus 设置为 0,它们在屏幕上显示为以前的数字而不是 0
【解决方案4】:

当你第一次运行 MainActivity 时,额外的不是由 secondActivity 设置的。所以它的显示错误。尝试关注

if(getIntent() != null && getIntent().getExtras() != null)
myBoolean = getIntent().getExtras().getBoolean("clearList");

然后

 if(myBoolean)

 {
  Intent intent2 = getIntent();
  wynik = intent2.getStringExtra("clearList");
if (wynik.equals("clear")) {

    tempLukasz = 0;
    tempMarcelina = 0;
    tempKarolina = 0;
    foodCategorySum = 0;
    catCategorySum = 0;
    othersCategorySum = 0;
    lukaszJedzenie = 0;
    lukaszKot = 0;
    lukaszInne = 0;
    marcelinaJedzenie = 0;
    marcelinaKot = 0;
    marcelinaInne = 0;
    karolinaJedzenie = 0;
    karolinaKot = 0;
    karolinaInne = 0;
    newPayments.clear();
    wynik = "";
}
 }

【讨论】:

    【解决方案5】:

    问题在于,当第一次调用 onCreate() 时,它会检查应该由尚未调用的第二个活动填充的额外字符串。所以你在启动应用程序时肯定会得到一个 NPE。 如果您需要启动另一个活动并收到返回的结果,您应该调用 startActivityForResult() 而不是 startActivity()

    当用户完成第二个活动并返回时,系统会调用您活动的 onActivityResult() 方法。此方法包括三个参数: 1. 你传递给startActivityForResult()的请求代码。 2.第二个活动指定的结果代码。如果操作成功,则为 RESULT_OK;如果用户退出或操作由于某种原因失败,则为 RESULT_CANCELED。 3.承载结果数据的Intent。

    在这里查看完整描述Launching an explicit activity for getting back result

    【讨论】:

    • 但是.... 在我的 SecondaryActivity 中按下 按钮后,我不想让我直接进入 MainActivity。我只想在 SecondaryActivity 中进行一些计算并将字符串/布尔值/任何内容发送到 MainActivity,当我按下返回按钮让我回到 Main 时,应该执行我的清理/重置值代码。我尝试使用这里有人写道的代码: (intent2 != null && wynik != null && wynik.equals("clear")) 但它也没有执行代码(值没有重置,当我尝试敬酒时在这里它没有出现)。
    • 如果您只需要设置一些供 MainActivity 使用的值,那么快速解决方法是在 MainActivity 中创建静态字段并从第二个活动中设置它们,以便您可以更新它们的值您项目中的任何类,并且总是在需要时获取它们的更新值
    • 听起来很简单,我会在几分钟内尝试这种方法。感谢您的帮助,如果有效或无效,请更新
    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多