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