在 DatePickerDialog (Android) 上验证日期时出现 IllegalArgumentException
Posted
技术标签:
【中文标题】在 DatePickerDialog (Android) 上验证日期时出现 IllegalArgumentException【英文标题】:IllegalArgumentException when validating a date on DatePickerDialog (Android) 【发布时间】:2012-10-17 15:55:51 【问题描述】:当我在 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 //属性界面 私人线性布局布局NouvelleDepense = null; 私人按钮 bDate = null; 私人公历日历 gcDate = null; //工具 私人 SimpleDateFormat sdfAjd = null; 静态最终 int DATE_DIALOG_ID = 1; /*监听器*/ 私人 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)); ; 私人 OnClickListener oclBoutonDate = new View.OnClickListener() @覆盖 公共无效 onClick(查看 v) 显示对话(DATE_DIALOG_ID); ; /*方法*/ @覆盖 公共无效 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); @覆盖 公共布尔 onCreateOptionsMenu(菜单菜单) getMenuInflater().inflate(R.menu.activity_main, menu); 返回真; @SuppressWarnings("静态访问") @覆盖 受保护的对话 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。
很久以来我一直在寻找答案,但所有类似的帖子都是关于创建对话框时提出的异常,而不是日期验证。
你能帮我看看是怎么回事吗?
谢谢
【问题讨论】:
此行导致异常sdfAjd.format(gcDate)
。您将无效参数传递给 SimpleDateFormat 类的 format()
方法。我也怀疑sdfAjd
对象的初始化。
【参考方案1】:
在您的 OnDateSetListener 中添加 getTime()
到您的格式命令:
bDate.setText(sdfAjd.format(gcDate.getTime()));
不同之处在于 GregorianCalendar#getTime()
返回一个 Date 对象并调用 SimpleDateFormat#format(Date)
,如您所知,它在您的 onCreate()
方法中工作正常。
但是format(gcDate)
本身调用了引发异常的通用SimpleDateFormat#format(Object)
方法,因为这个format()
不理解Date 对象。
【讨论】:
非常感谢!我没有注意到我错过了这个,我从没想过会是因为这个,因为在调试中我什至没有在验证对话框后输入源中定义的“onDateSet”。谢谢:) 没问题。了解您的 LogCat 显示onDateSet()
被称为:at com.boka.lesbonscomptes.ActivityMain$1.onDateSet(ActivityMain.java:43)
所以要小心你是如何使用调试器的!祝你好运!以上是关于在 DatePickerDialog (Android) 上验证日期时出现 IllegalArgumentException的主要内容,如果未能解决你的问题,请参考以下文章
在 DatePickerDialog (Android) 上验证日期时出现 IllegalArgumentException
android笔记:DatePickerDialog日期设置对话框
DatepickerDialog 不在 Textview 中添加日期
DatePickerDialog 结果返回到 Fragment?