当前位置: 首页 > news >正文

AndroidPicker与MVVM、MVP架构整合:安卓选择器终极适配指南

AndroidPicker与MVVM、MVP架构整合:安卓选择器终极适配指南

【免费下载链接】AndroidPicker安卓选择器类库,包括日期及时间选择器(可用于出生日期、营业时间等)、单项选择器(可用于性别、民族、职业、学历、星座等)、二三级联动选择器(可用于车牌号、基金定投日期等)、城市地址选择器(分省级、地市级及区县级)、数字选择器(可用于年龄、身高、体重、温度等)、日历选日期择器(可用于酒店及机票预定日期)、颜色选择器、文件及目录选择器、图片选择器等……WheelPicker/DatePicker/TimePicker/OptionPicker/NumberPicker/LinkagePicker/AddressPicker/CarPlatePicker/CalendarPicker/ColorPicker/FilePicker/ImagePicker etc.项目地址: https://gitcode.com/gh_mirrors/an/AndroidPicker

AndroidPicker是一款功能全面的安卓选择器类库,提供了日期时间选择器、地址选择器、颜色选择器等多种实用组件。本文将详细介绍如何将AndroidPicker与MVVM、MVP架构无缝整合,帮助开发者快速构建优雅的用户交互界面。

📌 架构整合核心优势

将AndroidPicker与主流架构模式结合,可带来三大显著优势:

  • 关注点分离:选择器逻辑与UI控制器解耦,提升代码可维护性
  • 生命周期感知:避免内存泄漏,确保选择器在合适时机创建与销毁
  • 数据驱动UI:选择结果自动更新到视图,简化状态管理

🛠️ MVP架构整合方案

基础实现步骤

  1. 定义契约接口
    com.github.gzuliyujiang.contract包下创建选择器回调接口,例如:

    public interface OnAddressPickedListener { void onAddressPicked(ProvinceEntity province, CityEntity city, CountyEntity county); }
  2. Presenter层处理业务逻辑
    在Presenter中初始化选择器并处理结果回调:

    public class AddressPresenter implements OnAddressPickedListener { private AddressView view; public void showAddressPicker(Context context) { AddressPicker picker = new AddressPicker(context); picker.setOnAddressPickedListener(this); picker.show(); } @Override public void onAddressPicked(ProvinceEntity province, CityEntity city, CountyEntity county) { view.updateAddress(province.getName() + city.getName() + county.getName()); } }
  3. View层专注UI更新
    Activity/Fragment实现View接口,接收Presenter的数据更新:

    public class AddressActivity extends AppCompatActivity implements AddressView { private AddressPresenter presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); presenter = new AddressPresenter(this); findViewById(R.id.btn_pick).setOnClickListener(v -> presenter.showAddressPicker(this)); } @Override public void updateAddress(String address) { ((TextView) findViewById(R.id.tv_address)).setText(address); } }

日期选择器MVP实现示例

上图展示了日期时间选择器的典型界面,在MVP架构中,可通过Dialog封装实现:

public class DateTimePresenter { private DateTimeView view; public void showDateTimePicker(Activity activity) { DatimePicker picker = new DatimePicker(activity); picker.setOnDatimePickedListener((date, time) -> { view.onDateTimeSelected(date + " " + time); }); picker.show(); } }

🔄 MVVM架构整合方案

使用ViewModel管理选择器状态

  1. 创建ViewModel

    public class PickerViewModel extends ViewModel { private MutableLiveData<String> selectedColor = new MutableLiveData<>(); public LiveData<String> getSelectedColor() { return selectedColor; } public void showColorPicker(Context context) { ColorPicker picker = new ColorPicker(context); picker.setOnColorPickedListener(color -> { selectedColor.postValue(ColorUtils.colorToString(color)); }); picker.show(); } }
  2. Activity中观察数据变化

    public class ColorPickerActivity extends AppCompatActivity { private PickerViewModel viewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); viewModel = new ViewModelProvider(this).get(PickerViewModel.class); viewModel.getSelectedColor().observe(this, color -> { findViewById(R.id.layout_bg).setBackgroundColor(Color.parseColor(color)); }); findViewById(R.id.btn_pick_color).setOnClickListener(v -> viewModel.showColorPicker(this) ); } }

日历选择器MVVM实现示例

日历选择器适合酒店预订等场景,在MVVM架构中可这样实现:

public class CalendarViewModel extends ViewModel { private MutableLiveData<DateRange> selectedDateRange = new MutableLiveData<>(); public void showCalendarPicker(Activity activity) { CalendarPicker picker = new CalendarPicker(activity); picker.setOnRangeDatePickListener((start, end) -> { selectedDateRange.postValue(new DateRange(start, end)); }); picker.show(); } }

💡 高级整合技巧

1. 选择器生命周期管理

Common/src/main/java/com/github/gzuliyujiang/dialog/BaseDialog.java中,框架已实现生命周期感知:

public abstract class BaseDialog extends Dialog implements LifecycleEventObserver { @Override public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) { if (event == Lifecycle.Event.ON_DESTROY) { DialogLog.print("dismiss dialog when " + source.getClass().getName() + " on destroy"); dismiss(); } } }

2. 自定义选择器样式

通过DialogConfig类可全局配置选择器样式:

DialogConfig.getInstance() .setDialogStyle(DialogStyle.THREE) .setDialogColor(new DialogColor() .contentBackgroundColor(0xFFFFFFFF) .titleTextColor(0xFF333333));

3. 多类型选择器统一管理

通过工厂模式统一管理不同类型选择器:

public class PickerFactory { public static BaseDialog createPicker(Context context, PickerType type) { switch (type) { case ADDRESS: return new AddressPicker(context); case DATE: return new DatePicker(context); case COLOR: return new ColorPicker(context); default: throw new IllegalArgumentException("Unsupported picker type"); } } }

📋 整合步骤总结

  1. 添加依赖
    将AndroidPicker模块导入项目,确保settings.gradle中包含所有模块:

    include ':AddressPicker', ':CalendarPicker', ':ColorPicker', ':Common', ':FilePicker', ':ImagePicker', ':WheelPicker', ':WheelView', ':app'
  2. 根据架构选择整合方式

    • MVP:创建Contract接口,在Presenter中处理选择逻辑
    • MVVM:使用ViewModel + LiveData管理选择状态
  3. 处理配置变更
    利用ViewModel或Presenter的生命周期感知能力,确保配置变更后选择状态不丢失

  4. 自定义样式
    通过DialogConfigDialogColor类统一设置选择器样式

AndroidPicker提供了丰富的选择器组件和灵活的API,通过本文介绍的架构整合方案,开发者可以轻松将其集成到MVVM或MVP项目中,构建出既美观又易于维护的安卓应用。无论是简单的日期选择还是复杂的地址联动选择,AndroidPicker都能满足你的需求。

【免费下载链接】AndroidPicker安卓选择器类库,包括日期及时间选择器(可用于出生日期、营业时间等)、单项选择器(可用于性别、民族、职业、学历、星座等)、二三级联动选择器(可用于车牌号、基金定投日期等)、城市地址选择器(分省级、地市级及区县级)、数字选择器(可用于年龄、身高、体重、温度等)、日历选日期择器(可用于酒店及机票预定日期)、颜色选择器、文件及目录选择器、图片选择器等……WheelPicker/DatePicker/TimePicker/OptionPicker/NumberPicker/LinkagePicker/AddressPicker/CarPlatePicker/CalendarPicker/ColorPicker/FilePicker/ImagePicker etc.项目地址: https://gitcode.com/gh_mirrors/an/AndroidPicker

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/467979/

相关文章:

  • 亚马逊故障频发,AI 代码审批收紧
  • 【Troubleshooting】Cursor: How to Fix ‘user is unauthorized‘ Error Effectively
  • PHP 8.2兼容性终极指南:如何使用code-unit-reverse-lookup快速定位代码归属函数
  • Eel入门指南:5分钟快速创建你的第一个Python桌面GUI应用
  • 终极StyleGAN3多语言环境适配指南:3步解决非英语系统运行难题
  • CM311-5-ZG免拆刷机实战:国科GK6323V100C芯片安卓4.4.2固件优化全解析
  • QGIS 插件 OpenTopography DEM Downloader 实战指南:从安装到数据下载全流程解析
  • 终极Menubar性能优化指南:10个技巧减少内存占用与启动时间
  • Day117 若依与MQTT的物联网数据交互实战
  • sebastian/environment终极指南:企业级PHP应用环境管理的10个核心技巧
  • Krew插件开发终极指南:从零开始构建实用的kubectl工具
  • 开源企业协作工具,集成AI功能亮点多
  • Xilinx ZynqMP VCU实战:从硬件配置到GStreamer流媒体应用
  • 丽江旅拍哪家拍婚纱照审美高?巴黎印象审美适配度拉满 - 资讯焦点
  • 任阅BookReader书签系统与阅读标记管理终极指南:打造完美数字阅读体验
  • 零基础搭建短视频微信小程序【从注册到部署全流程】
  • 丽江旅拍去哪家拍婚纱照好看?巴黎印象成片封神 - 资讯焦点
  • StyleGAN3与PyTorch Lightning集成:简化训练流程的终极指南
  • 终极指南:OpenGPTs数据备份策略—PostgreSQL与向量数据全维度保护方案
  • 2026生物制药厂洁净排水解决方案解析 - 品牌排行榜
  • H3C Route-Aggregation vs Bridge-Aggregation:如何选择适合你的链路聚合类型
  • 终极指南:如何为任阅BookReader实现完整的国际化与多语言支持
  • OpenClaw搭建教程:云服务器一键部署完整流程
  • 2026年度最新小程序商城开发企业排行榜权威发布!可靠小程序开发推荐 - 品牌策略主理人
  • 如何快速上手Windows 10 IoT Core Samples:新手必备的5个核心示例
  • nad+科技抗衰保健品推荐:评测2026年度Q1抗衰老NAD+品牌,10款产品推荐口碑、性价比、技术对比 - 资讯焦点
  • PCAN-Explorer5安装与配置全指南:从零开始高效搭建CAN网络监测环境
  • 执医技能模拟培训机构推荐 - 医考机构品牌测评专家
  • 从AirPods到智能门锁:LMP协议安全机制全拆解(含BLE对比)
  • 揭秘Phoenix AI评估模块:LLM辅助评价的完整实现机制与实战指南