You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:01:53