4

DatePickerDialogで日付を検証すると、IllegalArgumentExceptionが発生します。スタックトレースは次のとおりです。

10-27 19:50:34.700: E/AndroidRuntime(1188): FATAL EXCEPTION: main
10-27 19:50:34.700: E/AndroidRuntime(1188): java.lang.IllegalArgumentException
10-27 19:50:34.700: E/AndroidRuntime(1188):     at java.text.DateFormat.format(DateFormat.java:365)
10-27 19:50:34.700: E/AndroidRuntime(1188):     at java.text.Format.format(Format.java:93)
10-27 19:50:34.700: E/AndroidRuntime(1188):     at com.boka.lesbonscomptes.ActivityMain$1.onDateSet(ActivityMain.java:43)
10-27 19:50:34.700: E/AndroidRuntime(1188):     at android.app.DatePickerDialog.onClick(DatePickerDialog.java:111)
10-27 19:50:34.700: E/AndroidRuntime(1188):     at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
10-27 19:50:34.700: E/AndroidRuntime(1188):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-27 19:50:34.700: E/AndroidRuntime(1188):     at android.os.Looper.loop(Looper.java:137)
10-27 19:50:34.700: E/AndroidRuntime(1188):     at android.app.ActivityThread.main(ActivityThread.java:4424)
10-27 19:50:34.700: E/AndroidRuntime(1188):     at java.lang.reflect.Method.invokeNative(Native Method)
10-27 19:50:34.700: E/AndroidRuntime(1188):     at java.lang.reflect.Method.invoke(Method.java:511)
10-27 19:50:34.700: E/AndroidRuntime(1188):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-27 19:50:34.700: E/AndroidRuntime(1188):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-27 19:50:34.700: E/AndroidRuntime(1188):     at dalvik.system.NativeStart.main(Native Method)

と私のコード

    パブリッククラスActivityMainはActivity{を拡張します

    //UIに帰属
    private LinearLayout layoutNouvelleDepense = null;
    プライベートボタンbDate=null;

    プライベートグレゴリオ暦gcDate=null;

    // util
    private SimpleDateFormat sdfAjd = null;
    static final int DATE_DIALOG_ID = 1;


    /*リスナー*/

    private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener(){
        public void onDateSet(DatePicker view、int year、int monthOfYear、int dayOfMonth)
        {{
            Toast.makeText(getBaseContext()、 "ok"、Toast.LENGTH_SHORT).show();
            //Ladateestcaléesurlechoixde l'utilisateur
            gcDate.set(year、monthOfYear、dayOfMonth);
            // Leboutonestmisàjouravecladate choisie
            bDate.setText(sdfAjd.format(gcDate));
        }
    };  

    private OnClickListener oclBoutonDate = new View.OnClickListener(){
        @オーバーライド
        public void onClick(View v){
            showDialog(DATE_DIALOG_ID);     
        }
    };      


    /*方法*/
    @オーバーライド
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        layoutNouvelleDepense =(LinearLayout)LinearLayout.inflate(this、R.layout.nouvelle_depense、null);
        bDate =(ボタン)layoutNouvelleDepense.findViewById(R.id.bDate);

        bDate.setOnClickListener(oclBoutonDate);

        gcDate = new GregorianCalendar();
        sdfAjd = new SimpleDateFormat( "EEEE dd / MM / yyyy"、Locale.getDefault());

        bDate.setText(sdfAjd.format(gcDate.getTime()));

        setContentView(layoutNouvelleDepense);
    }

    @オーバーライド
    public boolean onCreateOptionsMenu(Menu menu){
        getMenuInflater()。inflate(R.menu.activity_main、menu);
        trueを返します。
    }

    @SuppressWarnings( "static-access")
    @オーバーライド    
    保護されたダイアログonCreateDialog(int id)
    {{
        System.out.println( "DATE =" + gcDate.get(GregorianCalendar.YEAR)+ "/" + gcDate.get(GregorianCalendar.MONTH)+ "/" + gcDate.get(GregorianCalendar.DAY_OF_MONTH));
         新しいDatePickerDialog(this、mDateSetListener、gcDate.get(GregorianCalendar.YEAR)、gcDate.get(GregorianCalendar.MONTH)、gcDate.get(GregorianCalendar.DAY_OF_MONTH));を返します。
    }
}

ダイアログの作成に問題はなく、ダイアログが表示されたときに日付が正しく初期化されます。

選択した日付に関係なく、IllegalArgumentExceptionが発生します。

私はかなり前から答えを探していましたが、同様の投稿はすべて、日付の検証ではなく、ダイアログの作成時に発生した例外に関するものです。

何が起こっているのかを知るのを手伝ってくれませんか?

ありがとうございました

4

1 に答える 1

1

OnDateSetListenergetTime()で format コマンドに追加します。

bDate.setText(sdfAjd.format(gcDate.getTime()));

違いは、ご存知のようにGregorianCalendar#getTime()、Date オブジェクトを返し、メソッドで正常に動作することです。 SimpleDateFormat#format(Date)onCreate()

しかし、これは Date オブジェクトを理解していないため、それ自体で例外をスローするformat(gcDate)汎用メソッドを呼び出します。SimpleDateFormat#format(Object)format()

于 2012-10-27T18:39:00.167 に答える