Fragment启动Activity后onActivityResult未触发,如何实现回调?
Fragment中启动Activity并获取回调的解决方案
没问题,Fragment完全可以实现启动Activity并接收回调的功能!你的代码里有几个关键问题导致onActivityResult没触发,我帮你一一梳理并修正:
问题根源与修复步骤
1. 错误的Activity启动方式
你当前用的startActivity()不会触发任何回调,要获取返回结果必须使用startActivityForResult(),并且需要传入一个唯一的请求码(用来区分不同的启动请求)。
建议直接调用Fragment自身的startActivityForResult(),而非通过getActivity()调用,这样回调会直接传递到Fragment的onActivityResult方法,避免宿主Activity的干扰。
2. 未调用父类的onActivityResult方法
在Fragment的onActivityResult()里,一定要记得调用super.onActivityResult(requestCode, resultCode, data);,否则可能会导致回调链路中断。
3. SignatureActivity的代码问题
btnSave的点击事件存在语法错误:缺少@Override注解和方法体闭合括号- 建议使用系统定义的结果码常量(比如
RESULT_OK对应-1),而非自定义的200,这样代码更规范,也避免和系统码冲突
修正后的完整代码示例
修正后的Fragment代码
public class WaiverFragment extends Fragment { private static final int REQUEST_CODE_SIGNATURE = 100; // 定义唯一请求码 private View myView; private Button signBtn; // 假设device是已初始化的变量 @Nullable @Override public View onCreateView(final LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { getActivity().setTitle("Waiver"); myView = inflater.inflate(R.layout.waiver_layout, container, false); signBtn = myView.findViewById(R.id.signBtn); signBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getActivity(), SignatureActivity.class); intent.putExtra("signatureAbleId", device.id); intent.putExtra("signatureAbleType", "App\\Models\\Device"); // 使用Fragment的startActivityForResult方法 startActivityForResult(intent, REQUEST_CODE_SIGNATURE); } }); return myView; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data){ super.onActivityResult(requestCode, resultCode, data); // 必须调用父类方法 Log.v("Activity", "The activity has finished"); // 根据请求码和结果码判断逻辑 if(requestCode == REQUEST_CODE_SIGNATURE && resultCode == Activity.RESULT_OK){ saveWaiver(); } } private void saveWaiver(){ Log.v("Save Waiver", "Saving waiver for you."); } }
修正后的SignatureActivity代码
public class SignatureActivity extends AppCompatActivity { private Button btnClear; private Button btnSave; private int signatureAbleId; private String signatureAbleType; // 假设mSignaturePad是已定义的签名控件 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setContentView(R.layout.activity_signature); Bundle bundle = getIntent().getExtras(); if(bundle != null){ signatureAbleId = bundle.getInt("signatureAbleId"); signatureAbleType = bundle.getString("signatureAbleType"); } btnClear = findViewById(R.id.btnClear); btnSave = findViewById(R.id.btnSave); btnClear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mSignaturePad.clear(); } }); btnSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 如果需要返回数据给Fragment,可添加到Intent中 // Intent resultIntent = new Intent(); // resultIntent.putExtra("signature_data", "your_signature_content"); // setResult(RESULT_OK, resultIntent); // 设置结果码并关闭Activity setResult(RESULT_OK); finish(); } }); } }
最后注意事项
确保Fragment所在的宿主Activity的onActivityResult()方法中调用了super.onActivityResult(requestCode, resultCode, data);——如果宿主Activity重写了这个方法但没调用super,Fragment的回调就不会被触发。
这样修改后,点击SignatureActivity的保存按钮,Fragment的onActivityResult就会正常触发啦!
内容的提问来源于stack exchange,提问作者Lewis Smith
相关产品推荐
相关产品推荐

