当我在第二个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 clase,但它也不起作用。
答案 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 = "";
}
}