如何将Camera Activity返回的Uri从Bottom Sheet传递至Customer Details Activity
解决方案
核心问题是:你在BottomSheet中调用startActivityForResult,结果会优先返回给BottomSheet的onActivityResult,而非直接回到宿主的Customer Details Activity。即使BottomSheet被关闭,只要它还未被销毁,依然能接收到返回结果,我们只需要通过回调把结果传递给宿主即可。
方法一:接口回调(适配传统API)
1. 修改BottomSheet类,添加回调接口
public class BottomSheet extends BottomSheetDialogFragment { // 新增回调接口,用于传递拍照结果 public interface OnMediaResultListener { void onPhotoTaken(Uri imageUri); } private OnMediaResultListener mListener; int layout; boolean isNew; MaterialTextView takePhoto, uploadPhoto, delete_cancelPhoto; static final int PICK_IMAGE = 1; // 绑定宿主Activity为回调接收者 @Override public void onAttach(@NonNull Context context) { super.onAttach(context); try { mListener = (OnMediaResultListener) context; } catch (ClassCastException e) { throw new ClassCastException(context.toString() + " 必须实现OnMediaResultListener接口"); } } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(layout, container, false); takePhoto = view.findViewById(R.id.bottom_sheet_take_photo); uploadPhoto = view.findViewById(R.id.bottom_sheet_upload_photo); delete_cancelPhoto = view.findViewById(R.id.bottom_sheet_delete_photo); if(isNew) delete_cancelPhoto.setText(R.string.cancel); takePhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(getContext(), CameraActivity.class); startActivityForResult(i, 100); getDialog().dismiss(); } }); // 上传、删除/取消按钮逻辑保持不变 return view; } // 重写onActivityResult接收Camera返回的结果 @Override public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 100 && resultCode == Activity.RESULT_OK && data != null) { Uri imageUri = data.getData(); if (mListener != null) { // 通过回调将Uri传递给宿主Activity mListener.onPhotoTaken(imageUri); } } } public void setLayout(int layout, boolean isNew) { this.layout = layout; this.isNew = isNew; } }
2. 修改Customer Details Activity实现回调接口
public class CustomerDetailsActivity extends AppCompatActivity implements BottomSheet.OnMediaResultListener { // 原有初始化、点击事件逻辑保持不变 // 实现回调方法,处理返回的Uri设置头像 @Override public void onPhotoTaken(Uri imageUri) { Toast.makeText(this, imageUri.toString(), Toast.LENGTH_SHORT).show(); Glide.with(this) .load(imageUri) .into(binding.customerDetailsCustomerDp); } // 可删除原有的onActivityResult方法,结果已通过回调传递 }
方法二:使用Jetpack Activity Result API(推荐,替代废弃API)
如果你的项目已接入Jetpack组件,推荐使用registerForActivityResult替代已废弃的startActivityForResult:
1. 修改BottomSheet类
public class BottomSheet extends BottomSheetDialogFragment { public interface OnMediaResultListener { void onPhotoTaken(Uri imageUri); } private OnMediaResultListener mListener; int layout; boolean isNew; MaterialTextView takePhoto, uploadPhoto, delete_cancelPhoto; // 定义相机启动器 private ActivityResultLauncher<Intent> cameraLauncher; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 注册Activity结果回调 cameraLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { Uri imageUri = result.getData().getData(); if (mListener != null) { mListener.onPhotoTaken(imageUri); } } } ); } @Override public void onAttach(@NonNull Context context) { super.onAttach(context); try { mListener = (OnMediaResultListener) context; } catch (ClassCastException e) { throw new ClassCastException(context.toString() + " 必须实现OnMediaResultListener接口"); } } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(layout, container, false); takePhoto = view.findViewById(R.id.bottom_sheet_take_photo); // 其他控件初始化逻辑不变 takePhoto.setOnClickListener(v -> { Intent i = new Intent(getContext(), CameraActivity.class); cameraLauncher.launch(i); getDialog().dismiss(); }); // 上传、删除/取消按钮逻辑保持不变 return view; } public void setLayout(int layout, boolean isNew) { this.layout = layout; this.isNew = isNew; } }
2. Customer Details Activity修改同方法一,实现OnMediaResultListener接口即可。
内容的提问来源于stack exchange,提问作者Aezikel
相关产品推荐
相关产品推荐

