如何在安卓中显示日期选择器(结束日期)大于起始日期?

3

大家好,我想在选择开始日期后显示日期选择器(结束日期)。从开始日期选择的日期之后,结束日期选择器将显示日期。结束日期将在开始日期之后显示日期选择器,而在开始日期之前不会显示。我需要做什么? 我尝试的是:

       fromdate = (EditText) findViewById(fromDate);
       todate = (EditText) findViewById(R.id.todate);
       fromdate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showTruitonDatePickerDialog(view);
        }
    });
    todate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showToDatePickerDialog(view);
        }
    });
    }
public void showTruitonDatePickerDialog(View v) {
    DialogFragment newFragment = new DatePickerFragment();
    newFragment.show(getSupportFragmentManager(), "datePicker");
   }
 public void showToDatePickerDialog(View v) {
    DialogFragment newFragment = new ToDatePickerFragment();
    newFragment.show(getSupportFragmentManager(), "datePicker");
}
 public static class DatePickerFragment extends DialogFragment implements
        DatePickerDialog.OnDateSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        // Do something with the date chosen by the user

        fromdate.setText(day + "/" + (month + 1) + "/" + year);
           }   }

public static class ToDatePickerFragment extends DialogFragment implements
       DatePickerDialog.OnDateSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }
   public void onDateSet(DatePicker view, int year, int month, int day) {
        // Do something with the date chosen by the user
        view.setMinDate(fromDate);
        todate.setText(day + "/" + (month + 1) + "/" + year); } }

您是在问如何自动跳转到下一个日期选择器吗?我有些困惑于您试图询问的内容,请您能否澄清一下? - Sam
使用DatePicker并设置setMinDate(long)和setMaxDate(long)。或者您可以使用DatePickerDialog,传递起始日期和(OnDateSetListener)[https://developer.android.com/reference/android/app/DatePickerDialog.OnDateSetListener.html]。 - Muzammil Husnain
@Sam 我有两个编辑框,一个是开始日期,另一个是结束日期。当我点击其中一个编辑框(比如开始日期),会弹出日期选择器以选择日期。现在我的问题是,结束日期的日期选择器应该只显示从开始日期之后的日期。 - karthi
哦,所以您想要更新结束日期选择器为选定的开始日期之后的第一个日期,对吗?如果是这样,请在关闭时共享所选日期到fromDate类变量,并在启动时将其传递给toDate作为要使用的日期,而不是获取当前日期,请使用toDate并添加1天。 - Sam
如果需要,我会回答您的问题并详细解释。 - Sam
6个回答

4
     fromdate = (EditText) findViewById(fromDate);
    todate = (EditText) findViewById(R.id.todate);
    fromdate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showTruitonDatePickerDialog(view);
        }
    });
    todate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showToDatePickerDialog(view);
        }
    });
}
public void showTruitonDatePickerDialog(View v) {
    DialogFragment newFragment = new DatePickerFragment();
    newFragment.show(getSupportFragmentManager(), "datePicker");
}

public void showToDatePickerDialog(View v) {
    DialogFragment newFragment = new ToDatePickerFragment();
    newFragment.show(getSupportFragmentManager(), "datePicker");
}

public static class DatePickerFragment extends DialogFragment implements
        DatePickerDialog.OnDateSetListener {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);
        DatePickerDialog datePickerDialog;
        datePickerDialog = new DatePickerDialog(getActivity(),this, year, 
        month,day);
        return datePickerDialog;
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        // Do something with the date chosen by the user
        fromdate.setText(day + "/" + month  + "/" + year);
    }

}

public static class ToDatePickerFragment extends DialogFragment implements
        DatePickerDialog.OnDateSetListener {
   // Calendar startDateCalendar=Calendar.getInstance();
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
          String getfromdate = fromdate.getText().toString().trim();
          String getfrom[] = getfromdate.split("/");
        int year,month,day;
             year= Integer.parseInt(getfrom[2]);
             month = Integer.parseInt(getfrom[1]);
            day = Integer.parseInt(getfrom[0]);
        final Calendar c = Calendar.getInstance();
        c.set(year,month,day+1);
        DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(),this, year,month,day);
       datePickerDialog.getDatePicker().setMinDate(c.getTimeInMillis());
        return datePickerDialog;
    }
    public void onDateSet(DatePicker view, int year, int month, int day) {

        todate.setText(day + "/" + month  + "/" + year);
    }
}

我选择了一个开始日期为1/09/2017。 在此输入图像描述 然后我打开了一个结束日期,它显示从2/09/2017开始。 在此输入图像描述

但是月份显示为减一(对于七月返回06)!!? - Arnold Brown

2
尝试使用以下代码:

尝试使用这段代码

    public static boolean isDateAfter(String startDate,String endDate)
    {
    try
    {
        String myFormatString = "yyyy-M-dd"; // for example
        SimpleDateFormat df = new SimpleDateFormat(myFormatString);
        Date date1 = df.parse(endDate));
        Date startingDate = df.parse(startDate);

        if (date1.after(startingDate))
            return true;
        else
            return false;
    }
    catch (Exception e) 
    {

        return false;
    }
}

如果结束日期在开始日期之后,它将返回true。


1

定义startDateCalendar如下:

Calendar startDateCalendar=Callendar.getInstance();

更新片段代码

public static class DatePickerFragment extends DialogFragment implements
            DatePickerDialog.OnDateSetListener {

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            // Use the current date as the default date in the picker
            final Calendar c = Calendar.getInstance();
            int year = c.get(Calendar.YEAR);
            int month = c.get(Calendar.MONTH);
            int day = c.get(Calendar.DAY_OF_MONTH);
            DatePickerDialog datePickerDialog = new DatePickerDialog(mActivity,this, year, month,day);
            datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis());
            // Create a new instance of DatePickerDialog and return it
            return datePickerDialog;
        }

        public void onDateSet(DatePicker view, int year, int month, int day) {
            // Do something with the date chosen by the user

            fromdate.setText(day + "/" + (month + 1) + "/" + year);
            startDateCalendar.set(Calendar.YEAR, year);
            startDateCalendar.set(Calendar.MONTH, month);
            startDateCalendar.set(Calendar.DAY_OF_MONTH, day);
        }   }

    public static class ToDatePickerFragment extends DialogFragment implements
            DatePickerDialog.OnDateSetListener {

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            // Use the current date as the default date in the picker
            final Calendar c = Calendar.getInstance();
            int year = c.get(Calendar.YEAR);
            int month = c.get(Calendar.MONTH);
            int day = c.get(Calendar.DAY_OF_MONTH);

            DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(),this, startDateCalendar.get(Calendar.YEAR), startDateCalendar.get(Calendar.MONTH), startDateCalendar.get(Calendar.DAY_OF_MONTH));
            datePickerDialog.getDatePicker().setMinDate(startDateCalendar.getTimeInMillis());
            // Create a new instance of DatePickerDialog and return it
            return datePickerDialog;
        }
        public void onDateSet(DatePicker view, int year, int month, int day) {
            // Do something with the date chosen by the user
            view.setMinDate(fromDate);
            todate.setText(day + "/" + (month + 1) + "/" + year); } }

它能够工作,但问题在于结束日期选择器将根据当前日期工作。我希望它能够根据起始日期工作。 - karthi
@karthi,你正在从日历实例中获取年、月和日,因此显示的是当前日期。日历实例返回当前日期。 - J Ramesh
@J Ramesh如果我选择开始日期为05/11/2016……然后结束日期将显示从开始日期的下一天开始,就像日期选择器会显示从06/11/2016开始的日期。我不需要在开始日期上有任何限制。 - karthi
是的,兄弟,它正在工作。但是在开始日期和结束日期中都不需要当前日期。实际上,应该根据开始日期限制结束日期。 - karthi
然后 datePickerDialog.getDatePicker().setMinDate(startDateCalendar.getTimeInMillis()); 这行代码将限制选择结束日期在开始日期之后,并显示具有开始日期作为默认日期的对话框。 - J Ramesh
显示剩余4条评论

0

你可以使用 setMinDate 和 setMaxDate 方法来设置日期选择器对话框。

例如: DatePicker toPicker = Util.getDatePicker(getActivity(), toDateSetListener, toYear, toMonth, toDay) .getDatePicker(); toPicker.setMinDate(getToMinDate()); toPicker.setMaxDate(System.currentTimeMillis());


0

所以当您关闭 fromDate 对话框时,只需将变量存储在类级别中。

fromYear fromMonth fromDay

然后,当您启动 toDate(fromYear, fromMonth, fromDay) 对话框时, 不要使用当前日期,而是使用 from 变量,并将天数加1,以便从第二天开始选择日期。明白了吗?


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接