startActivityForResult替代方案:迁移至新API实现Picasso图片获取
迁移图片选择代码到Activity Result API(配合Picasso使用)
没问题!自从startActivityForResult被废弃后,官方推荐用Activity Result API来处理这类跨页面结果回调的场景,下面是针对你的代码的完整迁移方案,两种写法任你选:
写法一:兼容原有Intent逻辑(和旧代码逻辑最接近)
首先在你的Activity类里定义一个全局的ActivityResultLauncher,然后在onCreate中完成注册:
// 全局声明Launcher private ActivityResultLauncher<Intent> pickImageLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_activity_layout); // 注册图片选择的Launcher,替代原来的onActivityResult pickImageLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { // 这里处理返回的结果,逻辑和旧的onActivityResult一致 if (result.getResultCode() == RESULT_OK) { Intent data = result.getData(); if (data != null && data.getData() != null) { Uri mImageUri = data.getData(); // 依然用Picasso加载图片,这部分代码完全不用改 Picasso.get().load(mImageUri).into(productImage); } } } ); }
然后修改原来的openFileChooser方法,把startActivityForResult换成Launcher的launch方法:
private void openFileChooser() { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); // 用Launcher启动选择器,替代startActivityForResult pickImageLauncher.launch(intent); }
写法二:使用官方封装的GetContent契约(更简洁推荐)
官方为常见的场景封装了专门的契约,比如选择文件/图片,用这个写法可以省去手动构建Intent的步骤:
// 全局声明简化版的Launcher private ActivityResultLauncher<String> pickImageLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_activity_layout); // 注册基于GetContent契约的Launcher pickImageLauncher = registerForActivityResult( new ActivityResultContracts.GetContent(), // 回调直接拿到选中的Uri,不需要判断resultCode uri -> { if (uri != null) { Picasso.get().load(uri).into(productImage); } } ); } // 简化后的选择方法,一行搞定 private void openFileChooser() { // 传入图片的MIME类型,直接启动选择器 pickImageLauncher.launch("image/*"); }
注意事项
- 必须在Activity/Fragment的生命周期启动前(比如
onCreate方法里)完成Launcher的注册,不能在点击事件等动态场景中注册,否则会抛出异常。 - 如果是在Fragment中使用,代码逻辑完全一致,直接在Fragment的
onCreate中注册Launcher即可。 - 你的Picasso加载逻辑完全不需要改动,因为只是获取Uri的方式变了,Uri的使用和之前完全一样。
内容的提问来源于stack exchange,提问作者Nusry KR
相关产品推荐
相关产品推荐

