2

我在DatePickerDialog上驗證日期時遇到IllegalArgumentException。這裏是堆棧跟蹤:當在DatePickerDialog上驗證日期時發生IllegalArgumentException(Android)

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) 

和我的代碼

 
    public class ActivityMain extends Activity { 

    //Attributs UI 
    private LinearLayout layoutNouvelleDepense = null; 
    private Button bDate = null; 

    private GregorianCalendar gcDate = null; 

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


    /*LISTENER*/ 

    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(); 
      //La date est calée sur le choix de l'utilisateur 
      gcDate.set(year, monthOfYear, dayOfMonth); 
      //Le bouton est mis à jour avec la date choisie 
      bDate.setText(sdfAjd.format(gcDate)); 
     } 
    }; 

    private OnClickListener oclBoutonDate = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      showDialog(DATE_DIALOG_ID);  
     } 
    };  


    /*METHODES*/ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     layoutNouvelleDepense = (LinearLayout) LinearLayout.inflate(this,R.layout.nouvelle_depense, null); 
     bDate = (Button) 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); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    @SuppressWarnings("static-access") 
    @Override  
    protected Dialog onCreateDialog(int id) 
    { 
     System.out.println("DATE = " + gcDate.get(GregorianCalendar.YEAR) + "/" + gcDate.get(GregorianCalendar.MONTH) + "/" + gcDate.get(GregorianCalendar.DAY_OF_MONTH)); 
     return new DatePickerDialog(this, mDateSetListener, gcDate.get(GregorianCalendar.YEAR), gcDate.get(GregorianCalendar.MONTH), gcDate.get(GregorianCalendar.DAY_OF_MONTH)); 
    } 
}

我在創造對話沒有問題,並顯示該對話框時的日期被正確初始化。

無論選擇哪個日期,都會引發IllegalArgumentException。

我一直在尋找一個答案,因爲相當長的一段時間,但所有類似的帖子都是關於創建對話框時引發的exceletion,而不是日期的驗證。

你能幫我找出發生了什麼嗎?

謝謝

+0

該行導致'sdfAjd.format(gcDate)'異常。您將無效參數傳遞給** SimpleDateFormat **類的'format()'方法。我也懷疑sdfAjd對象的初始化。 – user370305

回答

1

在你OnDateSetListener添加getTime()到您的格式命令:

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

不同的是,GregorianCalendar#getTime()返回Date對象,並調用SimpleDateFormat#format(Date),正如你知道的,在你的onCreate()工作正常方法。

但是format(gcDate)本身調用通用的SimpleDateFormat#format(Object)方法拋出異常,因爲這個format()不理解Date對象。

+0

非常感謝!我沒有注意到我錯過了這個,我從來沒有想過會這樣,因爲在調試中,我沒有在驗證對話框後輸入源代碼中定義的「onDateSet」。謝謝:) – bokabraq

+0

沒問題。理解你的LogCat顯示調用了'onDateSet()':'at com.boka.lesbonscomptes.ActivityMain $ 1.onDateSet(ActivityMain.java:43)'所以要小心你如何使用調試器!祝你好運! – Sam

相關問題