2

DatePickerDialog에서 날짜의 유효성을 검사 할 때 IllegalArgumentException이 발생합니다. 여기에 스택 트레이스입니다 : 내가 대화 상자를 만드는 데 아무런 문제가 없다DatePickerDialog (Android)에서 날짜의 유효성을 검사 할 때 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) 

내 코드

 
    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이 발생합니다.

나는 꽤 오랫동안 해답을 찾고 있었지만 모든 유사한 게시물은 날짜의 유효성 검사가 아닌 대화 작성시 제기 된 excepetion에 관한 것입니다.

무슨 일이 일어나는지 알아 주시겠습니까?

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

의 차이는 GregorianCalendar#getTime()는 Date 객체를 반환하고 당신이 알고, 당신의 onCreate()에서 잘 작동 SimpleDateFormat#format(Date) 호출하는 것입니다 :

은 format 명령에 getTime()를 추가하려면 OnDateSetListener 당신에게

+0

이 줄은 'sdfAjd.format (gcDate)'예외를 발생시킵니다. 잘못된 인수를 ** SimpleDateFormat ** 클래스의'format()'메서드에 전달하고 있습니다. 또한'sdfAjd' 객체의 초기화에 의심의 여지가 있습니다. – user370305

답변

1

감사 방법.

그러나 format(gcDate)은이 format()이 Date 개체를 인식하지 못하기 때문에 예외를 throw하는 일반 SimpleDateFormat#format(Object) 메서드를 자체적으로 호출합니다.

+0

고마워요! 나는 이것을 놓친 것을 눈치 채지 못했다. 디버그에서 대화 상자의 유효성을 확인한 후에 내 소스에 정의 된 "onDateSet"을 입력하지 않았기 때문에이 문제로 생각하지 못했다. 고마워요 :) – bokabraq

+0

문제 없습니다. LogCat에서'onDateSet()'이 호출되었다는 것을 알았습니다 :'at com.boka.lesbonscomptes.ActivityMain $ 1.onDateSet (ActivityMain.java:43)'그래서 디버거를 어떻게 사용하고 있는지주의하십시오! 행운을 빕니다! – Sam

관련 문제