使用 android 5.0 的三星 DatePicker 崩溃

Posted

技术标签:

【中文标题】使用 android 5.0 的三星 DatePicker 崩溃【英文标题】:DatePicker crash in samsung with android 5.0 【发布时间】:2015-04-05 09:26:54 【问题描述】:

我在使用棒棒糖 5.0 的 samsung note 2 设备中创建日期选择器时遇到问题。 例外是:

java.util.IllegalFormatConversionException: %d can not format java.lang.String arguments
    at java.util.Formatter.badArgumentType(Formatter.java:1489)
    at java.util.Formatter.transformFromInteger(Formatter.java:1689)
    at java.util.Formatter.transform(Formatter.java:1461)
    at java.util.Formatter.doFormat(Formatter.java:1081)
    at java.util.Formatter.format(Formatter.java:1042)
    at java.util.Formatter.format(Formatter.java:1011)
    at java.lang.String.format(String.java:1803)
    at android.content.res.Resources.getString(Resources.java:1457)
    at android.content.Context.getString(Context.java:397)
    at android.widget.SimpleMonthView$MonthViewTouchHelper.getItemDescription(SimpleMonthView.java:684)
    at android.widget.SimpleMonthView$MonthViewTouchHelper.onPopulateNodeForVirtualView(SimpleMonthView.java:628)
    at com.android.internal.widget.ExploreByTouchHelper.createNodeForChild(ExploreByTouchHelper.java:377)
    at com.android.internal.widget.ExploreByTouchHelper.createNode(ExploreByTouchHelper.java:316)
    at com.android.internal.widget.ExploreByTouchHelper.access$100(ExploreByTouchHelper.java:50)
    at com.android.internal.widget.ExploreByTouchHelper$ExploreByTouchNodeProvider.createAccessibilityNodeInfo(ExploreByTouchHelper.java:711)
    at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfVirtualNode(AccessibilityInteractionController.java:1179)
    at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1091)
    at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
    at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
    at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
    at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
    at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
    at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
    at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
    at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
    at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
    at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchAccessibilityNodeInfos(AccessibilityInteractionController.java:888)
    at android.view.AccessibilityInteractionController.findAccessibilityNodeInfoByAccessibilityIdUiThread(AccessibilityInteractionController.java:155)
    at android.view.AccessibilityInteractionController.access$400(AccessibilityInteractionController.java:53)
    at android.view.AccessibilityInteractionController$PrivateHandler.handleMessage(AccessibilityInteractionController.java:1236)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:145)
    at android.app.ActivityThread.main(ActivityThread.java:5944)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184)

我已经使用了官方android studio页面中提供的示例:

public static class DatePickerFragment extends DialogFragment
            implements DatePickerDialog.OnDateSetListener 

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);
        // Create a new instance of DatePickerDialog and return it

        DatePickerDialog dpd = new DatePickerDialog(getActivity(), this,year, month, day);
        return dpd;


    
    @Override
    public void onDateSet(DatePicker view, int year, int month, int day) 
        // get the date here

    

我这样称呼它:

DialogFragment newFragment = new DatePickerFragment();
newFragment.show(getFragmentManager(), "datePicker");

在其他设备上工作正常。

我还尝试使用DatePicker 创建自己的布局,非常简单但也崩溃了。这是一些 Android 错误吗?

【问题讨论】:

这是三星的 Lollipop 版本中的一个错误,AOSP 中不存在该错误。您需要联系三星支持。 我虽然 proguard cfg 解决了它,但它仍然崩溃。问题出在样式 Theme.AppCompat 仅适用于三星 Note3。我的决定是更改 DatePicker DatePickerDialog dpd = new DatePickerDialog(getActivity(),R.style.MyDatePicker, this, year, month, day); 的样式 嗨@vilson 你能解释一下 R.style.MyDatePicker 吗?你在里面放了什么?谢谢! @AlexBlack <style name="MyDatePicker" parent="@android:style/Theme.Holo.Light"> <item name="android:background">#AAAAAA</item> <item name="android:textColor">#000000</item> <item name="android:titleTextStyle">@style/Title_text_12dp</item> </style> <style name="Title_text_12dp" parent="@android:style/Widget.TextView"> <item name="android:textSize">10sp</item> </style> 它崩溃了,因为活动的样式为 Theme.AppCompat @AlexBlack 试过了,但它仍然崩溃,它显示 DatePicker 然后崩溃 【参考方案1】:

正如 Ridcully 所说,这是三星 5.0 实施的问题

可在此处找到解决方法建议。不幸的是,没有一个是最漂亮的。

DatePicker crashes on my device when clicked (with personal app)

【讨论】:

【参考方案2】:

忘记内置的日期选择器。只有一种方法可以摆脱崩溃:使用提供独立实现的库。

对于日期选择器片段:https://github.com/flavienlaurent/datetimepicker

对于日期选择器小部件:https://github.com/SingleCycleKing/CustomTimePicker(这更像是一个起点,而不是一个现成的解决方案)

【讨论】:

如何确保第三方库不会崩溃? 我已经在内置日期选择器崩溃的设备上测试了这两个库。另外,我使用库发布了我的应用程序,突然崩溃报告停止了。这不是一个确切的证据,但我没有收到由库本身引起的任何崩溃。好吧,永远不能保证开源库没有错误 ;-)【参考方案3】:

正如 alanv 所注意到的,这是三星 Android 5 实施的一个错误。

我设置了一个不同的主题,它显示带有(旧)微调器的日期选择器,而不是日历视图。在代码中,我检查应用程序是否在带有棒棒糖和非英语语言的三星设备上运行,如果是,我将主题与微调器一起应用。这很好用,不需要其他库或其他 hack。

如果需要,我可以添加主题以及如何将其应用于此答案。

【讨论】:

以上是关于使用 android 5.0 的三星 DatePicker 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

三星5.0以上系统(亲测有效)激活XPOSED框架的方法

三星6.0系统设备最完美激活XPOSED框架的方法

在 Android 上使用 Visual Studio 2015 进行调试停止工作

Android 三星 Galaxy S4 自定义相机预览失真

DownloadManager 无法使用 Pie 下载到三星的外部存储

Android - 在三星设备上使用 USSD API 运行 USSD *#0011#