Lollipop5.0を使用してsamsungnote2デバイスで日付ピッカーを作成するのに問題があります。例外は次のとおりです。
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スタジオページで提供されている例を使用しました:
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バグですか?
Ridcullyが言うように、Samsungの5.0実装の問題
回避策の提案はここにあります。残念ながら、最も美しいものはありません。
組み込みの日付ピッカーを忘れてください。クラッシュを取り除く唯一の方法は、独立した実装を提供するライブラリを使用することです。
日付ピッカーフラグメントの場合: https://github.com/flavienlaurent/datetimepicker
日付ピッカーウィジェットの場合: https://github.com/SingleCycleKing/CustomTimePicker (これはすぐに使用できるソリューションというよりも出発点です)
Alanvが気付いたように、これはSamsungのAndroid 5実装のバグです。
カレンダービューの代わりに(古い)スピナーを使用して日付ピッカーを表示する別のテーマを設定しました。コードでは、アプリがLollipopと英語以外の言語を使用するsamsungデバイスで実行されているかどうかを確認し、実行されている場合は、スピナーを使用してテーマを適用します。これはうまく機能し、他のライブラリや他のハックは必要ありません。
必要に応じて、テーマとそれをこの回答に適用する方法を追加できます。