当前位置: 首页 > 知识库问答 >
问题:

在DatePickerDialog(Android)上验证日期时出现IllegalArgumentException

张英范
2023-03-14

验证DatePickerDialog上的日期时出现了IllegalArgumentException。下面是StackTrace:

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。

我一直在寻找答案,但所有类似的帖子都是关于创建对话框时出现的过度,而不是日期的验证。

你能帮我查查是怎么回事吗?

谢谢

共有1个答案

毕宇
2023-03-14

在OnDateSetListener中,将getTime()添加到format命令中:

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

不同的是,gregorianCalendar#gettime()返回一个日期对象,并调用SimpleDateFormat#format(Date),正如您所知,它在onCreate()方法中运行良好。

但是format(gcDate)本身调用泛型SimpleDateFormat#format(Object)方法,该方法引发异常,因为该format()不理解Date对象。

 类似资料:
  • 我想从明天开始设置DatePicker对话框的最小日期。如果今天是2015年4月30日,则应从2015年5月1日开始。

  • 问题内容: 我试图建立一个PHP日期验证(MM / DD / YYYY),但我遇到了问题。这是我得到的样本: 问题答案: 您可以使用checkdate。例如,如下所示: 一种更偏执的方法,不会盲目相信输入内容:

  • 我正在尝试设置php日期验证(MM/DD/YYYY),但我遇到了问题。以下是我得到的一个示例:

  • 我有一个方法可以使用日历返回当前日期,如下所示: 另一方面,我有一个DatePickerDialog,我需要用它来更新以前的值。 问题是这个DatePicker总是以年=1900开始,我怎么才能以当前日期开始呢? 如何使用 DatePickerDialog 获取一周之日?

  • 本文向大家介绍Android DatePickerDialog,包括了Android DatePickerDialog的使用技巧和注意事项,需要的朋友参考一下 示例 DatePickerDialog是最简单的使用方法DatePicker,因为您可以在应用程序中的任何位置显示对话框。您不必使用DatePicker小部件来实现自己的布局。 如何显示对话框: 您可以DataPicker从上面的对话框中获

  • 问题内容: 无论如何,是否可以验证给定日期(yyyy-MM- dd)是否为有效日期?它也应该处理leap年。例如(2015-02-29)应该无效。我将日期作为字符串检索,并将其放入joda DateTime对象。 问题答案: 我认为,这应该对您有用(如果您想保持简单)。 你必须做一个。