主Activity使用Fragment时onActivityResult未触发的问题解决
核心问题
你没有使用带返回结果的启动Activity方法,而是用了普通的startActivity(),这导致系统不会触发onActivityResult()回调。另外,从Fragment中启动时直接调用Context的方法,也可能导致结果传递异常。
具体修复步骤
修改FragmentAdapter中启动Activity的代码
将原来的startActivity(intent)替换为startActivityForResult(intent, 0)(这里的0要和主Activity中requestCode的判断值一致):@Override public void onClick(View v) { Intent intent = new Intent(v.getContext(), VoteOnPollActivity.class); intent.putExtra("pollGuid", fi.guid); // 替换为带请求码的启动方法 ((Fragment)this).startActivityForResult(intent, 0); }注意:如果Adapter依附于Fragment,要确保调用的是Fragment的
startActivityForResult方法,而非直接用Context的。如果是Fragment内部的点击事件,直接用getActivity().startActivityForResult(...)或者startActivityForResult(...)均可。确认主Activity的onActivityResult逻辑
你的主Activity代码已正确重写onActivityResult且调用了super.onActivityResult(),这部分没问题。可添加日志确认是否收到回调:@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.d("MainActivity", "收到结果:requestCode=" + requestCode + ", resultCode=" + resultCode); if (requestCode == 0) { if(resultCode == this.RESULT_OK){ String result=data.getStringExtra("guid"); followFragment.deletePoll(result); } } }AndroidX项目推荐方案
如果使用AndroidX,建议用ActivityResultLauncher替代旧的startActivityForResult,避免生命周期问题:// 在Fragment中初始化 private ActivityResultLauncher<Intent> voteLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { Intent data = result.getData(); if (data != null) { String guid = data.getStringExtra("guid"); // 通知主Activity处理,或直接在Fragment中处理 ((MainActivity)getActivity()).handlePollResult(guid); } } } ); // 启动Activity时调用 @Override public void onClick(View v) { Intent intent = new Intent(v.getContext(), VoteOnPollActivity.class); intent.putExtra("pollGuid", fi.guid); voteLauncher.launch(intent); }这种方式无需重写
onActivityResult,更符合现代Android开发规范。
内容的提问来源于stack exchange,提问作者redoc01

