【问题标题】:Android - Update minDate and maxDate of a DatePicker many timesAndroid - 多次更新 DatePicker 的 minDate 和 maxDate
【发布时间】:2015-03-19 21:41:54
【问题描述】:

我有 2 个 DatePicker,第一个是开始日期,第二个是结束日期。我希望两者都具有当前日期的 maxDate (这适用于我的代码),并且我希望当我更改开始日期时,第二个 DatePicker 的 minDate 将更新为该日期(反之亦然)。使用此侦听器,我可以处理操作,但第二个 DatePicker 不会在布局上刷新其 minDate。

private DatePicker.OnDateChangedListener startDataListener = new DatePicker.OnDateChangedListener() {

    public void onDateChanged(DatePicker view, int year, int monthOfYear,
            int dayOfMonth) { 
        Calendar c = Calendar.getInstance();
        c.set(year, monthOfYear, dayOfMonth);
        endDate.setMinDate(c.getTimeInMillis());
    }
};

private DatePicker.OnDateChangedListener endDateListener = new DatePicker.OnDateChangedListener() {

    public void onDateChanged(DatePicker view, int year, int monthOfYear,
            int dayOfMonth) {

        Calendar c = Calendar.getInstance();
        c.set(year, monthOfYear, dayOfMonth);
        startDate.setMaxDate(c.getTimeInMillis());
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    startDate= (DatePicker)findViewById(***);
    endDate= (DatePicker)findViewById(***);

    startDate.setMaxDate(Calendar.getInstance().getTimeInMillis());
    startDate.init(year, month, day, startDateListener);

    endDate.setMinDate(c.getTimeInMillis()-1000);
    endDate.setMaxDate(c.getTimeInMillis());
    endDate.init(year, month, day, endDateListener);
}

【问题讨论】:

    标签: android datepicker


    【解决方案1】:

    来自https://stackoverflow.com/a/19722636

    这是因为setMinDate() 的代码有检查:

    if (mTempDate.get(Calendar.YEAR) == mMinDate.get(Calendar.YEAR) && mTempDate.get(Calendar.DAY_OF_YEAR) != mMinDate.get(Calendar.DAY_OF_YEAR)
            return;
    

    简单的解决方法是首先设置不同年份的最小日期。

    使用建议的解决方案并在应用解决方案时避免执行侦听器我来到了这个:

    DatePicker startDate, endDate;
    Calendar minDate = Calendar.getInstance(), maxDate = Calendar.getInstance();
    boolean callFromStartDate = false, callFromEndDate = false;
    
    private DatePicker.OnDateChangedListener startDateListener = new DatePicker.OnDateChangedListener() {
        public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            // Avoid listener execution when there's a forced updated on picker
            if(callFromEndDate){
                callFromEndDate = false;
                return;
            }
    
            callFromStartDate = true;
    
            // Force picker update
            minDate.set(year - 1, monthOfYear, dayOfMonth);
            endDate.setMinDate(minDate.getTimeInMillis());  // Calls onDateChange from the other picker
    
            callFromStartDate = true;
    
            // Update the picker to the desired date
            minDate.set(year, monthOfYear, dayOfMonth);
            endDate.setMinDate(minDate.getTimeInMillis());
        }
    };
    
    private DatePicker.OnDateChangedListener endDateListener = new DatePicker.OnDateChangedListener() {
        public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            if(callFromStartDate) {
                callFromStartDate = false;
                return;
            }
    
            callFromEndDate = true;
    
            maxDate.set(year + 1, monthOfYear, dayOfMonth);
            startDate.setMaxDate(maxDate.getTimeInMillis());
    
            callFromEndDate = true;
    
            maxDate.set(year, monthOfYear, dayOfMonth);
            startDate.setMaxDate(maxDate.getTimeInMillis());
        }
    };
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        setContentView(R.layout.activity_main);
    
        startDate = (DatePicker) findViewById(R.id.datePicker);
        endDate = (DatePicker) findViewById(R.id.datePicker2);
    
        Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);
        long initialTimeInMillis = c.getTimeInMillis();
    
        startDate.setMinDate(initialTimeInMillis-2000000000);
        startDate.setMaxDate(initialTimeInMillis);
        startDate.init(year, month, day, startDateListener);
    
        endDate.setMinDate(initialTimeInMillis-2000000000);
        endDate.setMaxDate(initialTimeInMillis);
        endDate.init(year, month, day, endDateListener);
    }
    

    【讨论】:

    【解决方案2】:

    这是因为 setMinDate() 方法有检查

    if (mTempDate.get(Calendar.YEAR) == mMinDate.get(Calendar.YEAR)
                && mTempDate.get(Calendar.DAY_OF_YEAR) != mMinDate.get(Calendar.DAY_OF_YEAR){
            return;}
    

    简单设置

    mPicker.setMinDate(0); 
    //The Min date you wish to set.
    mPicker.setMinDate(new LocalDate().minusWeeks(2)
                                .toDateTimeAtStartOfDay().getMillis());
    

    至此,年份已更改为新的最小日期,因此它将设置新日期。 这对我有用

    【讨论】:

      【解决方案3】:

      只需初始化DatePickerDialog对象TWICEMULTIPLE次,每次更改setMinDate(milisecs)

      void yourListenerMethod() {
           datePickerDialog2 = new DatePickerDialog(getActivity(), date2, myCalendar
                  .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                  myCalendar.get(Calendar.DAY_OF_MONTH));
          datePickerDialog2.getDatePicker().setMaxDate(System.currentTimeMillis()-1000);
          datePickerDialog2.getDatePicker().setMinDate(date.getTime());
      }  
      

      【讨论】:

        猜你喜欢
        • 2014-07-03
        • 1970-01-01
        • 1970-01-01
        • 2015-02-11
        • 1970-01-01
        • 2017-04-07
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        相关资源
        最近更新 更多