使用 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。我的决定是更改 DatePickerDatePickerDialog 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 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 上使用 Visual Studio 2015 进行调试停止工作
Android 三星 Galaxy S4 自定义相机预览失真