Xamarin.Android DatePickerDialog在三星Android6.0.1设备崩溃的解决咨询
崩溃原因
- 代码中调用的单参数
DatePickerDialog(Context)构造方法,是Android API 24(对应Android 7.0)才新增到原生android.app.DatePickerDialog类的重载 - 出问题的三星设备运行Android 6.0.1(对应API 23),系统内置的DatePickerDialog类不存在这个单参数构造,因此运行时直接抛出
NoSuchMethodError - 正常运行的OPPO设备搭载Android 8.1.0(API 27),系统自带的类存在匹配的构造方法,因此不会触发崩溃
解决方法
方案一:使用全参数的原生类构造兼容低版本系统
低版本系统支持的原生DatePickerDialog构造,必须传入上下文、日期选择回调、初始年/月/日四个核心参数,替换原来的单参数写法即可。注意Android系统的月份计数从0开始,需要手动减1:
// 取当前系统日期作为弹窗默认展示的初始值 var currentDate = DateTime.Now; // 全参数构造的重载从API 1开始就存在,兼容所有低版本设备 U_Handler.dialog = new DatePickerDialog( this, null, // 可后续替换为实际的日期选择回调 currentDate.Year, currentDate.Month - 1, currentDate.Day );
方案二:使用V7兼容包提供的DatePickerDialog
项目已经引入了Android.Support.V7.App兼容库,该库内置了独立实现的DatePickerDialog类,不依赖高版本系统的原生类,自带单参数Context构造,能兼容所有项目支持的最低API版本。只需要在代码顶部加类型别名,把原生的DatePickerDialog替换成兼容库的实现即可,原有业务代码完全不用改动,写法和你现有的AlertDialog别名逻辑完全一致:
// 放在文件顶部的using声明区域 using DatePickerDialog = Android.Support.V7.App.DatePickerDialog;
是否需要引入第三方库?
完全不需要。上述两种方案都是基于项目已经集成的官方系统能力、官方兼容库实现的,不需要额外添加第三方日期选择、弹窗类库。
内容的提问来源于stack exchange,提问作者Tuna
相关产品推荐
相关产品推荐

