当onActivityResult为运行 resultCode为0且data为null时
When onActivityResult is ran resultCode is 0 and data is null
我有一个 activity 可以将一个布尔数组从我的库存 class 发送回我的主游戏 activity。但是onAcivityResult运行时resultCode为0,我的数据为null。
开始清点activity:
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
public void openInventory(View V) {
Intent bag = new Intent(MainGame.this, Inventory.class);
bag.putExtra(booInventory, inventory);
startActivityForResult(bag, requestItem);
}
结束清单activity:
public void onPause(){
Intent Item = new Intent(Inventory.this, MainGame.class);//data sent to MainGame activity
Item.putExtra(tools, itemUsed);
setResult(RESULT_OK, Item);
super.onPause();
}
onActivityResult:(toaster是创建toast的方法)
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 2){
if(resultCode == RESULT_OK){
toaster("result is ok", 500);
}
if(data != null){
toaster("it worked", 1500);
}else{
toaster("FAIL!", 1500);
}
}
首先,您不应该在 onPause() 中这样做。
其次,替换
Intent Item = new Intent(Inventory.this, MainGame.class)
有了这个:
Intent returnIntent = new Intent();
奖励:为代码使用静态变量,例如:
private static int SECOND_ACTIVITY_REQUEST_CODE = 2;
并在您的方法中使用该变量。
onPause()
可能不是使用 setResult 的好地方。我曾经有一个按钮来运行我用来设置结果的方法。像这样:
public void confirmResults(Item item) {
Intent intent = new Intent();
intent.putExtra("result",item);
setResult(RESULT_OK, intent);
finish();
}
此外,请验证此行中的 requestItem = 2
:
startActivityForResult(bag, requestItem);
添加到其他答案:
您的原始代码不起作用的原因(假设您只是依靠系统在您按下后退按钮时为您完成 activity)是 activity 结果已在 onPause()
执行时确定。
当您按下后退按钮时(同样,假设您没有进行任何更改),系统最终会为您调用 finish()
。 Activity.finish()
的来源查找 mResultCode
和 mResultData
,它们是在您调用 setResult()
时设置的。然后它开始关闭您的 activity。
这个过程最终会调用onPause()
。不过到时候,activity的结果已经确定了。
这就是将您的代码移至 onBackPressed()
的原因。您现在调用 setResult()
before activity 完成,因此 mResultCode
和 mResultData
是您想要的。
我有一个 activity 可以将一个布尔数组从我的库存 class 发送回我的主游戏 activity。但是onAcivityResult运行时resultCode为0,我的数据为null。
开始清点activity:
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
public void openInventory(View V) {
Intent bag = new Intent(MainGame.this, Inventory.class);
bag.putExtra(booInventory, inventory);
startActivityForResult(bag, requestItem);
}
结束清单activity:
public void onPause(){
Intent Item = new Intent(Inventory.this, MainGame.class);//data sent to MainGame activity
Item.putExtra(tools, itemUsed);
setResult(RESULT_OK, Item);
super.onPause();
}
onActivityResult:(toaster是创建toast的方法)
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 2){
if(resultCode == RESULT_OK){
toaster("result is ok", 500);
}
if(data != null){
toaster("it worked", 1500);
}else{
toaster("FAIL!", 1500);
}
}
首先,您不应该在 onPause() 中这样做。
其次,替换
Intent Item = new Intent(Inventory.this, MainGame.class)
有了这个:
Intent returnIntent = new Intent();
奖励:为代码使用静态变量,例如:
private static int SECOND_ACTIVITY_REQUEST_CODE = 2;
并在您的方法中使用该变量。
onPause()
可能不是使用 setResult 的好地方。我曾经有一个按钮来运行我用来设置结果的方法。像这样:
public void confirmResults(Item item) {
Intent intent = new Intent();
intent.putExtra("result",item);
setResult(RESULT_OK, intent);
finish();
}
此外,请验证此行中的 requestItem = 2
:
startActivityForResult(bag, requestItem);
添加到其他答案:
您的原始代码不起作用的原因(假设您只是依靠系统在您按下后退按钮时为您完成 activity)是 activity 结果已在 onPause()
执行时确定。
当您按下后退按钮时(同样,假设您没有进行任何更改),系统最终会为您调用 finish()
。 Activity.finish()
的来源查找 mResultCode
和 mResultData
,它们是在您调用 setResult()
时设置的。然后它开始关闭您的 activity。
这个过程最终会调用onPause()
。不过到时候,activity的结果已经确定了。
这就是将您的代码移至 onBackPressed()
的原因。您现在调用 setResult()
before activity 完成,因此 mResultCode
和 mResultData
是您想要的。