我正在开始一项活动:
Intent intent = new Intent(this, CreateItemDetailsActivity.class);
if(storeId != null) {
intent.putExtra(Identifiers.STORE_ID, storeId);
}
intent.putExtra(Identifiers.ITEM_NAME, name);
intent.putExtra(Identifiers.ITEM_DESCRIPTION, description);
startActivity(intent);
这可行,但是现在我需要将数据返回到原始活动,因此我将startActivity
调用更改为:
startActivityForResult(intent, CREATE_ITEM_RESULT);
({CREATE_ITEM_RESULT
只是我组成的一个随机整数63463657)
但是,我的应用程序崩溃时,没有调用两个onCreate
方法(我已经实现并在两者中都设置了断点):
Uncaught exception in thread main: java.lang.IllegalStateException: Could not execute method for android:onClick
android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:389)
(该代码在按钮点击处理程序中调用,因此为onClick
)
我看到App crashes when calling startActivityForResult遇到了同样的问题,但是被接受的答案表明删除了我没有的一行recipe.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
。
为什么startActivityForResult
正常工作时我在startActivity
上崩溃了?
(我的最低SDK级别为16,目标和编译SDK级别为27,并且我正在运行Android 8.1模拟器)
答案 0 :(得分:4)
如果尚未找到有关此问题的任何文档,但是尝试使用四位数的int
值应该可以消除该错误。
我已经阅读了startActivityForResult
的Google文档,但没有找到关于最大int
大小的任何参考。甚至代码文档也指出:
@param requestCode如果> = 0,则此代码将在 活动存在时的onActivityResult()
因此,没有提及最大int
值。奇怪...
编辑
感谢@MidasLefko查找此信息:
RequestCodes最多只能为0xffff(65535)。所以你可能是 调用startActivityForResult(intent,REQUEST_CODE);和REQUEST_CODE 大于65535。
在此网站上:
答案 1 :(得分:2)
在不支持的Activity class implementation of startActivityForResult中,对requestCode的最大int值没有限制,只要它是正数即可。但是,FragmentActivity(以及扩展名为AppCompatActivity)overrides this behavior(文档):
void startActivityForResult(意图,int requestCode)
修改标准行为,以允许将结果传递给片段。这施加了限制 该requestCode为<= 0xffff。
在source code of FragmentActivity中,发现以下有用的评论:
下一个候选请求索引的提示。请求索引是整数 在0和2 ^ 16-1之间,它们被编码为 Fragment.startActivityForResult(...)调用的requestCode。这个 允许我们将onActivityResult(...)调度到适当的位置 分段。请求索引由allocateRequestIndex(...)分配。
java中的int是32位,FragmentActivity使用16位来确定将结果发送到哪个片段,其他16位可用于开发人员。