web-dev-qa-db-ja.com

Android 5.0でサムスンのDatePickerクラッシュ

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バグですか?

25

Ridcullyが言うように、Samsungの5.0実装の問題

回避策の提案はここにあります。残念ながら、最も美しいものはありません。

(パーソナルアプリで)クリックすると、デバイスでDatePickerがクラッシュします

3
kassim

組み込みの日付ピッカーを忘れてください。クラッシュを取り除く唯一の方法は、独立した実装を提供するライブラリを使用することです。

日付ピッカーフラグメントの場合: https://github.com/flavienlaurent/datetimepicker

日付ピッカーウィジェットの場合: https://github.com/SingleCycleKing/CustomTimePicker (これはすぐに使用できるソリューションというよりも出発点です)

1
stefan222

Alanvが気付いたように、これはSamsungのAndroid 5実装のバグです。

カレンダービューの代わりに(古い)スピナーを使用して日付ピッカーを表示する別のテーマを設定しました。コードでは、アプリがLollipopと英語以外の言語を使用するsamsungデバイスで実行されているかどうかを確認し、実行されている場合は、スピナーを使用してテーマを適用します。これはうまく機能し、他のライブラリや他のハックは必要ありません。

必要に応じて、テーマとそれをこの回答に適用する方法を追加できます。

0
Ridcully