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
相关产品推荐
相关产品推荐

