将值从第二个活动传递到主要投掷NPE

时间:2015-10-01 17:14:51

标签: android android-intent

当我在第二个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是我的主要活动窗口的示例: enter image description here enter image description here

并且在第二张照片中我想要按下第二个活动中的AFTER按钮

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

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

任何想法我在哪里弄错了?我认为检查if(getIntent()!= null)是否会解决这个问题,或者只是使用try-catch来调整我的IF clase,但它也不起作用。

5 个答案:

答案 0 :(得分:0)

问题在于,当第一次调用 onCreate()时,它会检查应该由尚未被调用的第二个Activity填充的String extra。因此,在启动应用程序时,您肯定会获得NPE。 如果您需要启动其他活动并收到结果,则应调用 startActivityForResult()而不是 startActivity()

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

点击此处查看完整说明Launching an explicit activity for getting back result

答案 1 :(得分:0)

检查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")) {
    ... 
}

答案 2 :(得分:0)

我在这次尝试中注意到的主要问题是在启动时应该发生的null异常,另一种是当用于向后传递值时的意图我们倾向于使用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);

答案 3 :(得分:0)

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

试试吧,它可能有用:)(y)

答案 4 :(得分:0)

第一次运行MainActivity时,secondActivity不会设置extra。所以它显示错误。试试以下

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 = "";
}
 }