Android 将值从第二个活动传递到主活动将抛出NPE

Android 将值从第二个活动传递到主活动将抛出NPE,android,android-intent,Android,Android Intent,当我在第二个活动中按下按钮时,intent向main活动发送一个字符串。在onClick方法中: Intent intent = new Intent(this, MainActivity.class); String wynik = "clear"; intent.putExtra("clearList", wynik); 和主要活动,在onCreate方法中: Intent intent2 = getIntent(); wynik

当我在第二个活动中按下按钮时,intent向main活动发送一个字符串。在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并清除列表。图1是我的主要活动窗口的示例:

在第二张图中,我想在按下第二个活动中的按钮后得到它

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

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

你知道我哪里出错了吗?我认为检查if(getIntent()!=null)可以解决这个问题,或者只是用try-catch检查if类,但它也不起作用

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

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


请在此处查看完整描述。问题是,当第一次调用onCreate()时,它正在检查第二个尚未调用的活动应该填充的额外字符串。因此,在启动应用程序时,您肯定会获得NPE。 如果您需要启动另一个活动并收到结果,则应调用startActivityForResult(),而不是startActivity()

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


查看此处的完整描述

仅检查意图是否为null是不够的,还需要检查字符串本身是否为null

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

资料来源:

因此,将其更改为:

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

仅检查意图是否为null是不够的,还需要检查字符串本身是否为null

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

资料来源:

因此,将其更改为:

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

我在这次尝试中注意到的主要问题是,在开始时应该出现null异常,另一个问题是,当使用intents向后传递值时,我们倾向于使用onActivityResult

当你设定你的意图时

Intent intent = new Intent(this, MainActivity.class);
String wynik = "clear";
intent.putExtra("clearList", wynik);
我们把结果定为

setResult(x, intent);
然后我们通过调用activityresult在主类中接收意图

比如

 @Override 
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
      //dosomething with intent
 }
但是还需要记住设置调用第二个活动的意图
startActivityForResult(意向,x)

我在这次尝试中注意到的最奇怪的一点是,在开始时应该出现null异常,另一件事是意图,当用于向后传递值时,我们倾向于使用onActivityResult

当你设定你的意图时

Intent intent = new Intent(this, MainActivity.class);
String wynik = "clear";
intent.putExtra("clearList", wynik);
我们把结果定为

setResult(x, intent);
然后我们通过调用activityresult在主类中接收意图

比如

 @Override 
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
      //dosomething with intent
 }
但是还需要记住设置调用第二个活动的意图
startActivityForResult(意向,x)

问题就像祖尔卡宁说的那样。。。。。 尝试在第二个活动中创建一个静态布尔值,并将其命名为例如:“check_for_activity”(可以随意命名) 然后在额外的。。将“检查活动”设置为true。。 在主活动中..在getIntent行之前。。类型:if(secondActivity.check_for_activity==true){ //在这里输入从第二个活动获取值的代码 }


试试看,它可能会起作用:)(y)问题就像祖尔卡尼恩说的。。。。。 尝试在第二个活动中创建一个静态布尔值,并将其命名为例如:“check_for_activity”(可以随意命名) 然后在额外的。。将“检查活动”设置为true。。 在主活动中..在getIntent行之前。。类型:if(secondActivity.check_for_activity==true){ //在这里输入从第二个活动获取值的代码 }


只要尝试一下,它可能会起作用:)(y)当您第一次运行MainActivity时,额外的设置不是由secondActivity设置的。所以这是一个错误。试着跟随

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


第一次运行MainActivity时,secondActivity不会设置额外的活动。所以这是一个错误。试着跟随

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


请发布您用于发送和接收意图的确切代码。为什么您需要从第二个活动调用MainActivity,因为按“后退”按钮仍会返回MainActivity。这不是“后退”按钮,它是第二个活动中的一个按钮,在第二个活动的列表视图中存储一些数据,在它显示数据之后,我要“重置”第一个活动,以便每个数字和列表都为零