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

Tabbed App中从Fragment启动Intent并回传数据的问题求助

解决方案:用startActivityForResult实现Activity到Fragment的数据回传

你之前尝试的几种方法都存在针对性问题,导致数据无法正确回传甚至崩溃:

  • 直接调用startActivity打开MainActivity会创建新的Activity实例,原Fragment根本接收不到数据;
  • 在exerciseList里直接操作MainActivity的Fragment事务,因为跨Activity上下文错误,大概率找不到目标Fragment容器或者实例;
  • 直接调用Fragment的setData方法,ViewPager的Fragment可能因页面切换被销毁/重建,导致找不到实例引发崩溃;
  • 文件存储不仅冗余,还需要手动处理IO逻辑,容易出现异常且实时性差。

正确的做法是利用Android原生的Activity结果返回机制,以下是适配你现有代码的具体实现:


步骤1:修改exercises Fragment,用startActivityForResult打开列表页

在exercises.java的按钮点击事件里,替换原startActivity为startActivityForResult,并指定一个自定义请求码:

exButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
        Intent intent = new Intent(getActivity(), exerciseList.class);
        startActivityForResult(intent, 100); // 100为自定义请求码,只要唯一即可
    }
});

然后在exercises中重写onActivityResult方法,接收返回的数据并更新UI:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // 验证请求码和结果码,确保是我们期望的返回
    if (requestCode == 100 && resultCode == RESULT_OK) {
        if (data != null) {
            muscle = data.getStringExtra("muscle");
            exercise = data.getStringExtra("exercise");
            
            // 更新UI,比如设置按钮文本和背景
            exButton.setText(exercise);
            // 注意:字符串比较要用equals,不要用==,避免空指针和匹配错误
            if ("Chest".equals(muscle)) {
                exButton.setBackgroundResource(R.mipmap.chest);
            }
            // 可以继续添加其他肌肉类型的背景设置逻辑
        }
    }
}

步骤2:修改exerciseList Activity,选择条目后返回数据

在exerciseList.java的onChildClick方法中,删除你之前注释的尝试代码,替换为返回结果的逻辑:

@Override
public boolean onChildClick(ExpandableListView parent, View v,
                            int groupPosition, int childPosition, long id) {

    String muscle = listDataHeader.get(groupPosition);
    String exercise = listDataChild.get(listDataHeader.get(groupPosition)).get(childPosition);
    
    // 准备返回数据的Intent
    Intent resultIntent = new Intent();
    resultIntent.putExtra("muscle", muscle);
    resultIntent.putExtra("exercise", exercise);
    
    // 设置结果码和数据,通知原Fragment接收
    setResult(RESULT_OK, resultIntent);
    finish(); // 关闭当前Activity,回到原Fragment页面
    
    return true;
}

额外注意事项

  1. 确保exerciseList已经在AndroidManifest.xml中注册(你应该已经完成了这一步,但如果之前没做要补上);
  2. 如果你使用的是AndroidX库,也可以用更推荐的Activity Result Contracts替代startActivityForResult,但针对你当前的support.v4环境,上面的方案完全适用;
  3. 避免在Fragment中直接操作其他Activity的组件,始终通过Android提供的组件通信机制(比如Intent、ViewModel等)来传递数据。

内容的提问来源于stack exchange,提问作者Rowan Berry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:40:12