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

Android:如何将Fragment所在容器Activity的数据传递至另一个Activity?

搞定这个需求很简单,咱们一步步来实现:

1. 在Camera2BasicFragment中保存最新的预测结果

首先,咱们需要在Fragment里加个变量存储最新的识别结果,毕竟预测结果是在这里生成并显示的。然后在showToast方法里同步更新这个变量,再提供一个方法让Activity能拿到它:

public class Camera2BasicFragment extends Fragment {
    // 新增变量,用来存最新的识别结果
    private String latestPrediction;

    private void showToast(final String text) {
        final Activity activity = getActivity();
        if (activity != null) {
            activity.runOnUiThread(
                new Runnable() {
                    @Override
                    public void run() {
                        textView.setText(text);
                        // 同步更新最新识别结果
                        latestPrediction = text;
                    }
                });
        }
    }

    // 给Activity提供获取结果的方法
    public String getLatestPrediction() {
        return latestPrediction;
    }
}
2. 修改CameraActivity处理返回逻辑

接下来,在CameraActivity里咱们要拦截返回键的操作,把Fragment里的预测结果通过Intent带回去给MainActivity。注意要先持有Fragment的实例,这样才能拿到结果:

public class CameraActivity extends Activity {
    private Camera2BasicFragment cameraFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);
        if (null == savedInstanceState) {
            // 创建Fragment实例并保存引用
            cameraFragment = Camera2BasicFragment.newInstance();
            getFragmentManager()
                .beginTransaction()
                .replace(R.id.container, cameraFragment)
                .commit();
        } else {
            // 如果是页面重建的情况,从FragmentManager找回实例
            cameraFragment = (Camera2BasicFragment) getFragmentManager().findFragmentById(R.id.container);
        }
    }

    @Override
    public void onBackPressed() {
        // 准备返回给MainActivity的Intent
        Intent resultIntent = new Intent();
        String prediction = cameraFragment.getLatestPrediction();
        
        if (prediction != null) {
            // 把结果放到Intent里,用一个自定义的key标记
            resultIntent.putExtra("FOOD_PREDICTION", prediction);
            // 设置成功返回的结果码
            setResult(RESULT_OK, resultIntent);
        } else {
            // 如果还没有识别结果,设置取消的结果码
            setResult(RESULT_CANCELED);
        }
        
        // 执行默认的返回操作
        super.onBackPressed();
    }
}
3. 在MainActivity中接收结果并显示Toast

最后一步,在MainActivity里重写onActivityResult方法,接收CameraActivity返回的数据,然后用Toast显示出来:

public class MainActivity extends AppCompatActivity {
    // ... 你的其他代码 ...

    floatingActionButton1.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Intent i = new Intent(MainActivity.this, CameraActivity.class);
            startActivityForResult(i, 1); // 这里的请求码1要和下面onActivityResult里的对应上
        }
    });

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        
        // 检查请求码和结果码是否匹配
        if (requestCode == 1 && resultCode == RESULT_OK) {
            if (data != null) {
                String predictionResult = data.getStringExtra("FOOD_PREDICTION");
                // 显示识别结果的Toast
                Toast.makeText(this, "识别结果:" + predictionResult, Toast.LENGTH_LONG).show();
            }
        } else if (requestCode == 1 && resultCode == RESULT_CANCELED) {
            // 没有识别结果时的提示
            Toast.makeText(this, "暂无识别结果", Toast.LENGTH_SHORT).show();
        }
    }
}
小提示
  • 如果你用的是AndroidX库,记得把getFragmentManager()换成getSupportFragmentManager(),同时Fragment也要用AndroidX的版本哦。
  • 要是担心返回时还没完成识别,可以给latestPrediction设置一个默认值,比如"正在识别中...",这样Toast就不会显示空内容了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:38:46