集成SlideDateTimePicker库遇崩溃求助:Dialog主题FragmentActivity点击按钮闪退
嘿,我之前帮朋友排查过类似的问题,结合你的描述(Dialog主题+横屏的FragmentActivity),大概率是这几个常见原因导致的崩溃,你可以逐一排查试试:
1. 主题属性缺失导致的兼容性问题
你用的Theme.AppCompat.Dialog系列主题,可能缺少SlideDateTimePicker依赖的一些AppCompat主题属性,比如颜色或者窗口相关的配置。建议你自定义一个完整的Dialog主题,再给Activity使用:
<!-- 在res/values/styles.xml中添加 --> <style name="PickerDialogTheme" parent="Theme.AppCompat.Light.Dialog"> <item name="colorPrimary">@color/your_primary_color</item> <item name="colorPrimaryDark">@color/your_primary_dark_color</item> <item name="colorAccent">@color/your_accent_color</item> <item name="android:windowMinWidthMajor">@dimen/activity_min_width</item> </style>
然后修改Activity的主题配置:
<activity android:name=".AlertDateTimePickerParentActivity" android:screenOrientation="landscape" android:theme="@style/PickerDialogTheme"/>
2. 横屏适配的布局问题
SlideDateTimePicker的默认布局可能没有做横屏适配,强制横屏会导致布局测量异常(比如宽高超出窗口或者控件挤压)。你可以先临时去掉android:screenOrientation="landscape"测试,如果不崩溃了,就说明是横屏的锅:
- 要是必须保留横屏,你可以尝试在启动Picker的时候临时切换为竖屏,选择完成后再恢复:
// 保存当前屏幕方向 int originalOrientation = getRequestedOrientation(); // 强制切换为竖屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // 初始化并显示Picker new SlideDateTimePicker.Builder(getSupportFragmentManager()) .setListener(new SlideDateTimePicker.OnDateTimeSetListener() { @Override public void onDateTimeSet(Date date) { // 处理选择的时间 // 恢复原来的屏幕方向 setRequestedOrientation(originalOrientation); } }) .build() .show();
3. FragmentManager使用错误
因为你的Activity是FragmentActivity,一定要用getSupportFragmentManager()来初始化Picker,不能用系统原生的getFragmentManager()——毕竟这个库是基于AppCompat的Fragment体系开发的,用错了肯定会崩溃:
// 正确写法 SlideDateTimePicker.Builder builder = new SlideDateTimePicker.Builder(getSupportFragmentManager()); // 错误写法(别用这个!) // SlideDateTimePicker.Builder builder = new SlideDateTimePicker.Builder(getFragmentManager());
4. 依赖版本冲突
如果你的项目里AppCompat或者support库的版本,和SlideDateTimePicker依赖的版本不匹配,也会出现莫名崩溃。你可以去项目的build.gradle里检查AppCompat的版本,尽量和库依赖的版本保持一致,或者升级到兼容的新版本。
如果以上方法都没解决,一定要去Logcat里找具体的崩溃日志(比如NullPointerException、InflateException这些),日志里的异常栈能直接告诉你哪里出问题了,比瞎猜靠谱多了!
内容的提问来源于stack exchange,提问作者turtleboy

