如何简化ActivityResultLauncher的声明、传参与调用?
简化多个ActivityResultLauncher的声明与传参方案
方案一:自定义封装类(类型安全,推荐)
通过自定义类统一管理所有ActivityResultLauncher,既保证类型安全,又能简化传参和调用流程。
Java 示例
- 定义封装类:
public class LauncherContainer { private final ActivityResultLauncher<Intent> rangtGallery; private final ActivityResultLauncher<Intent> rangtCamera; private final ActivityResultLauncher<Intent> stockGallery; private final ActivityResultLauncher<Intent> stockCamera; public LauncherContainer( ActivityResultLauncher<Intent> rangtGallery, ActivityResultLauncher<Intent> rangtCamera, ActivityResultLauncher<Intent> stockGallery, ActivityResultLauncher<Intent> stockCamera) { this.rangtGallery = rangtGallery; this.rangtCamera = rangtCamera; this.stockGallery = stockGallery; this.stockCamera = stockCamera; } // 提供Getter方法 public ActivityResultLauncher<Intent> getRangtGallery() { return rangtGallery; } public ActivityResultLauncher<Intent> getRangtCamera() { return rangtCamera; } public ActivityResultLauncher<Intent> getStockGallery() { return stockGallery; } public ActivityResultLauncher<Intent> getStockCamera() { return stockCamera; } }
- 在Activity中使用:
// 声明各个Launcher private ActivityResultLauncher<Intent> rangtGalleryActivityResultLauncher; private ActivityResultLauncher<Intent> rangtCameraActivityResultLauncher; private ActivityResultLauncher<Intent> stockGalleryActivityResultLauncher; private ActivityResultLauncher<Intent> stockCameraActivityResultLauncher; // 初始化封装类并传入myClass LauncherContainer launcherContainer = new LauncherContainer( rangtGalleryActivityResultLauncher, rangtCameraActivityResultLauncher, stockGalleryActivityResultLauncher, stockCameraActivityResultLauncher); myparam = new myClass(launcherContainer);
- 在myClass中调用:
public class myClass { private final LauncherContainer launcherContainer; public myClass(LauncherContainer launcherContainer) { this.launcherContainer = launcherContainer; } // 调用示例 public void launchRangtGallery() { launcherContainer.getRangtGallery().launch(new Intent(...)); } }
方案二:枚举+Map(灵活易扩展)
用枚举定义Launcher类型,结合Map存储,避免字符串硬编码的拼写错误。
Java 示例
- 定义枚举:
public enum LauncherType { RANGT_GALLERY, RANGT_CAMERA, STOCK_GALLERY, STOCK_CAMERA }
- 在Activity中初始化Map:
private Map<LauncherType, ActivityResultLauncher<Intent>> launcherMap = new EnumMap<>(LauncherType.class); // 初始化Launcher后存入Map launcherMap.put(LauncherType.RANGT_GALLERY, rangtGalleryActivityResultLauncher); launcherMap.put(LauncherType.RANGT_CAMERA, rangtCameraActivityResultLauncher); launcherMap.put(LauncherType.STOCK_GALLERY, stockGalleryActivityResultLauncher); launcherMap.put(LauncherType.STOCK_CAMERA, stockCameraActivityResultLauncher); // 传入myClass myparam = new myClass(launcherMap);
- 在myClass中调用:
public class myClass { private final Map<LauncherType, ActivityResultLauncher<Intent>> launcherMap; public myClass(Map<LauncherType, ActivityResultLauncher<Intent>> launcherMap) { this.launcherMap = launcherMap; } // 调用示例 public void launchRangtGallery() { launcherMap.get(LauncherType.RANGT_GALLERY).launch(new Intent(...)); } }
方案三:Kotlin 数据类(极简实现)
如果使用Kotlin开发,数据类可以大幅简化封装代码:
data class LauncherContainer( val rangtGallery: ActivityResultLauncher<Intent>, val rangtCamera: ActivityResultLauncher<Intent>, val stockGallery: ActivityResultLauncher<Intent>, val stockCamera: ActivityResultLauncher<Intent> )
在Activity中使用:
val launcherContainer = LauncherContainer( rangtGalleryActivityResultLauncher, rangtCameraActivityResultLauncher, stockGalleryActivityResultLauncher, stockCameraActivityResultLauncher ) myparam = myClass(launcherContainer)
调用时直接通过属性访问:
launcherContainer.rangtGallery.launch(Intent(...))
内容的提问来源于stack exchange,提问作者Chris972
相关产品推荐
相关产品推荐

