【问题标题】:DatePicker crash in samsung with android 5.0使用 android 5.0 的三星 DatePicker 崩溃
【发布时间】: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 然后崩溃

标签: android exception android-5.0-lollipop samsung-mobile android-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。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 2014-05-14
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      • 2016-02-09
      • 2018-03-16
      相关资源
      最近更新 更多