在 kitkat 上设置 minDate 或 maxDate 时,Android DatePicker 崩溃

Posted

技术标签:

【中文标题】在 kitkat 上设置 minDate 或 maxDate 时,Android DatePicker 崩溃【英文标题】:Android DatePicker crashes when setting minDate or maxDate on kitkat 【发布时间】:2018-06-06 01:19:44 【问题描述】:

您好,我有一个日期选择器对话框,当用户点击 EditText 时会弹出该对话框。它可以在我尝试运行 android 6.0 的另一台设备上运行,但是当我在运行 kitkat 的桌子上尝试相同的应用程序时,它崩溃了。

我可以确认它是 setMinDate 或 setMaxDate 代码,因为我把它拿出来并且在我这样做之后页面没有崩溃。

这是日志:

E/AndroidRuntime: FATAL EXCEPTION: main

进程:com.xxxxxx.pointofsale,PID:13402 java.lang.NullPointerException 在 android.widget.CalendarView.onScroll(CalendarView.java:1216) 在 android.widget.CalendarView.access 900 美元(CalendarView.java:76) 在 android.widget.CalendarView$2.onScroll(CalendarView.java:1077) 在 android.widget.AbsListView.invokeOnItemScrollListener(AbsListView.java:1463) 在 android.widget.ListView.layoutChildren(ListView.java:1745) 在 android.widget.AbsListView.onLayout(AbsListView.java:2149) 在 android.view.View.layout(View.java:15125) 在 android.view.ViewGroup.layout(ViewGroup.java:4862) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1888) 在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1742) 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1651) 在 android.view.View.layout(View.java:15125) 在 android.view.ViewGroup.layout(ViewGroup.java:4862) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:515) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:450) 在 android.view.View.layout(View.java:15125) 在 android.view.ViewGroup.layout(ViewGroup.java:4862) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1888) 在 android.widget.LinearLayout.layoutHorizo​​ntal(LinearLayout.java:1877) 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1653) 在 android.view.View.layout(View.java:15125) 在 android.view.ViewGroup.layout(ViewGroup.java:4862) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:515) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:450) 在 android.view.View.layout(View.java:15125) 在 android.view.ViewGroup.layout(ViewGroup.java:4862) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:515) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:450) 在 android.view.View.layout(View.java:15125) 在 android.view.ViewGroup.layout(ViewGroup.java:4862) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:515) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:450) 在 android.view.View.layout(View.java:15125) 在 android.view.ViewGroup.layout(ViewGroup.java:4862) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1888) 在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1742) 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1651) 在 android.view.View.layout(View.java:15125) 在 android.view.ViewGroup.layout(ViewGroup.java:4862) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:515) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:450) 在 android.view.View.layout(View.java:15125) 在 android.view.ViewGroup.layout(ViewGroup.java:4862) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1888) 在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1742) 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1651) 在 android.view.View.layout(View.java:15125) 在 android.view.ViewGroup.layout(ViewGroup.java:4862) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:515) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:450) 在 android.view.View.layout(View.java:15125) 在 android.view.ViewGroup.layout(ViewGroup.java:4862) 在 android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2323) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2029) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1192) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6231) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:788) 在 android.view.Choreographer.doCallbacks(Choreographer.java:591) 在 android.view.Choreographer.doFrame(Choreographer.java:560) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:774) 在 android.os.Handler.handleCallback(Handler.java:808) 在 android.os.Handler.dispatchMessage(Handler.java:103) 在 android.os.Looper.loop(Looper.java:193) 在 android.app.ActivityThread.main(ActivityThread.java:5292) 在 java.lang.reflect.Method.invokeNative(Nativ

这是我的代码:

  final DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() 

        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear,
                              int dayOfMonth) 

            mCalendar.set(Calendar.YEAR, year);
            mCalendar.set(Calendar.MONTH, monthOfYear);
            mCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);

            String myFormat = "yyyy-MM-dd"; //In which you need put here
            SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);

            mSelectedDate = sdf.format(mCalendar.getTime());
            etDate.setText(Utils.formatDate(mSelectedDate, "yyyy-MM-dd", "EEEE, d MMMM yyyy"));
            getTravelSchedules();
        

    ;

    private final View.OnClickListener mDateViewOnClickListener = new View.OnClickListener() 

        @Override
        public void onClick(View v) 
            if (etDate.getText().toString().equals("")) 
                Toast.makeText(getApplicationContext(), "Please select a destination first!", Toast.LENGTH_LONG).show();
                return;
            

            Date today = new Date();
            Calendar c = Calendar.getInstance();
            c.setTime(today);
            c.add(Calendar.DATE, +7);
            final long maxDate = c.getTime().getTime();

            c.setTime(today);
            final long minDate = c.getTime().getTime();

            DatePickerDialog datePickerDialog = new DatePickerDialog(mContext, R.style.DialogTheme, mDateSetListener, mCalendar
                    .get(Calendar.YEAR), mCalendar.get(Calendar.MONTH),
                    mCalendar.get(Calendar.DAY_OF_MONTH));
            datePickerDialog.getDatePicker().setMinDate(minDate);
            datePickerDialog.getDatePicker().setMaxDate(maxDate);
            datePickerDialog.show();
        
    ;

【问题讨论】:

【参考方案1】:

你也可以使用这个功能

void showDatePickerDialog(final EditText et) 

    DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() 
        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) 
            // TODO Auto-generated method stub
            Calendar myCalendar = Calendar.getInstance();
            myCalendar.set(Calendar.YEAR, year);
            myCalendar.set(Calendar.MONTH, monthOfYear);
            myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
           et.setText(new SimpleDateFormat("dd MMM, yyyy", Locale.getDefault()).format(myCalendar.getTime()));     
        
    ;

    // Calendar Minimum Range
    Calendar calendarMinDate = Calendar.getInstance();
    calendarMinDate.add(Calendar.DATE, 0);

   // Calendar Maximum Range
    Calendar calendarMaxDate = Calendar.getInstance();
    calendarMaxDate.add(Calendar.DATE, +7);

    DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(),
            R.style.MyDatePickerDialogTheme, date, calYear, calMonth, calDay);
    datePickerDialog.getDatePicker().setMinDate(calendarMinDate.getTimeInMillis());
  datePickerDialog.getDatePicker().setMaxDate(calendarMaxDate.getTimeInMillis());
    datePickerDialog.show();

【讨论】:

好吧,所以基本上我没有在 datepickerdialog 本身上设置最小和最大日期,而是将它添加到日历中,谢谢你会试试看。 基本上是什么崩溃显示..你能准确显示 因为无论安卓版本如何,这对我来说都是完美的 它准确地显示了我在我的问题中发布的内容。应用程序已经储存了工作,这就是日志中的内容。我做了一些研究,它似乎是一个已知的 android 错误,可以设置最小日期,可以设置最大日期,但不能同时设置低于 API 19 的任何东西,否则它会崩溃。 那不可能,我制作的应用程序甚至可以在 17 上运行,并且在那里运行良好

以上是关于在 kitkat 上设置 minDate 或 maxDate 时,Android DatePicker 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Android Kitkat 4.4.2 - 如何设置 PACKAGE_VERIFIER_ENABLE 隐藏 API 属性?

DataTimePicker 怎样设置可以不能选择当前日期之后的时间

如何以编程方式在 Android(KitKat 及更高版本)中添加 APN

在javascript中为datepicker设置maxDate和minDate,不起作用

设置 minDate 以防止在开始日期之前选择结束日期

如何将 DatePickerDialog 中的 minDate 设置为 2 天后