如何在 DatePickerDialog Android 中禁用今天日期之前的日期?

Posted

技术标签:

【中文标题】如何在 DatePickerDialog Android 中禁用今天日期之前的日期?【英文标题】:How to disable dates before today date in DatePickerDialog Android? 【发布时间】:2013-07-26 13:40:38 【问题描述】:

我想在 DatePickerDialog 中禁用今天日期之前的日期。我是 android 新手,请建议我该怎么做。这是我为 DatePickerDialog 编写的代码

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

            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear,
                    int dayOfMonth) 
                // TODO Auto-generated method stub
                    myCalendar.set(Calendar.YEAR, year);
                    myCalendar.set(Calendar.MONTH, monthOfYear);
                    myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
                    updateLabel(val);
            
        ;
        depart.setOnClickListener(new View.OnClickListener() 

                @Override
                public void onClick(View v) 
                    // TODO Auto-generated method stub
                    new DatePickerDialog(this, date, myCalendar
                            .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                            myCalendar.get(Calendar.DAY_OF_MONTH)).show();
                    val=1;
                
            );

        returnDate.setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View v) 
                    // TODO Auto-generated method stub
                    new DatePickerDialog(this, date, myCalendar
                            .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                            myCalendar.get(Calendar.DAY_OF_MONTH)).show();
                            val=2;
                
            );


private void updateLabel(int val) 

        String myFormat = "dd/MM/yy"; //In which you need put here
        SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
        Log.d("Date vlue ", "==="+sdf.format(myCalendar.getTime()));
        if(val==1)
            depart.setText(sdf.format(myCalendar.getTime()));
        else
            returnDate.setText(sdf.format(myCalendar.getTime()));

        

请建议我该怎么做

【问题讨论】:

***.com/questions/4625002/… 【参考方案1】:

使用 getDatePicker() 方法获取 DatePickerDialog 中使用的 DatePicker,并使用 setMinDate(Long millis) 方法。

将您必须设置的最小日期(以 Epoch 为单位的毫秒数)传递给它。

所以你可以做类似的事情

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date d = sdf.parse("21/12/2012");
DatePicker datePicker = date.getDatePicker();
datePicker.setMinDate(d.getTime());

编辑:

好的,所以当您创建 DatePickerDialog 时,在显示它之前,只需将其保存到一个变量中,设置最小日期然后显示它。

DatePickerDialog dpd = new DatePickerDialog(IweenFlightSearch.this, date, myCalendar.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date d = sdf.parse("21/12/2012");
dpd.getDatePicker().setMinDate(d.getTime());
dpd.show();

这应该可以。

【讨论】:

我没有告诉你我必须在哪里进行这些更改,以便今天之前的日期将被禁用 您尚未发布所有代码,因此很难说“在哪里”您必须进行更改。您应该在某个地方有一个 DatePickerDialog 或一个 DatePicker。如果你需要进一步的帮助,你应该告诉我们你在哪里使用这些类。 请在我的问题中看到我已经发布了我用于 datePickerDailog 的完整代码 我比公认的答案更喜欢这个。非常干净和简单。【参考方案2】:

看这个例子..!

import java.util.Calendar;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;

public class MyAndroidAppActivity extends Activity 

    private TextView tvDisplayDate;

    private Button btnChangeDate;

    private int myear;
    private int mmonth;
    private int mday;

    static final int DATE_DIALOG_ID = 999;

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        setCurrentDateOnView();
        addListenerOnButton();

    

    // display current date
    public void setCurrentDateOnView() 

        tvDisplayDate = (TextView) findViewById(R.id.tvDate);       

        final Calendar c = Calendar.getInstance();
        myear = c.get(Calendar.YEAR);
        mmonth = c.get(Calendar.MONTH);
        mday = c.get(Calendar.DAY_OF_MONTH);

        // set current date into textview
        tvDisplayDate.setText(new StringBuilder()
                // Month is 0 based, just add 1
                .append(mmonth + 1).append("-").append(mday).append("-")
                .append(myear).append(" "));
    

    public void addListenerOnButton() 

        btnChangeDate = (Button) findViewById(R.id.btnChangeDate);

        btnChangeDate.setOnClickListener(new OnClickListener() 

            @Override
            public void onClick(View v) 

                showDialog(DATE_DIALOG_ID);

            

        );

    

    @Override
    protected Dialog onCreateDialog(int id) 
        switch (id) 
        case DATE_DIALOG_ID:
            // set date picker as current date
            DatePickerDialog _date =   new DatePickerDialog(this, datePickerListener, myear,mmonth,
                    mday)
                @Override
                public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth)
                   
                    if (year < myear)
                        view.updateDate(myear, mmonth, mday);

                    if (monthOfYear < mmonth && year == myear)
                        view.updateDate(myear, mmonth, mday);

                    if (dayOfMonth < mday && year == myear && monthOfYear == mmonth)
                        view.updateDate(myear, mmonth, mday);

                
            ;
            return _date;
        
        return null;
    

    private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() 

        // when dialog box is closed, below method will be called.
        public void onDateSet(DatePicker view, int selectedYear,
                int selectedMonth, int selectedDay) 
            myear = selectedYear;
            mmonth = selectedMonth;
            mday = selectedDay;

            // set selected date into textview
            tvDisplayDate.setText(new StringBuilder().append(mmonth + 1)
                    .append("-").append(mday).append("-").append(myear)
                    .append(" "));    

        
    ;


main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical" >

    <Button
        android:id="@+id/btnChangeDate"
        android:layout_
        android:layout_
        android:text="Change Date" />

    <TextView
        android:id="@+id/lblDate"
        android:layout_
        android:layout_
        android:text="Current Date (M-D-YYYY): "
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/tvDate"
        android:layout_
        android:layout_
        android:text=""
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

【讨论】:

在 DatePickerDialog 中禁用今天之前的日期。 我试过了,它只允许选择今天之前的日期 我现在正在工作我怎么能在我的代码中实现它,因为我的页面上有两个日历 现在工作正常,问题是一旦用户选择了之后的日期,他就无法选择该日期之前的日期 Hariharan 您的代码运行良好,但是当我将其安装在手机上时似乎无法运行。我的意思是选择了以前的日期,这不应该发生吗?我该如何解决?谢谢。【参考方案3】:

// 创建一个新的 DatePickerDialog 实例并返回它

 DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), this,year,month,day);
            datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis());
            return datePickerDialog;

【讨论】:

【参考方案4】:

我知道为时已晚。但希望这会有所帮助。使用

date .getDatePicker().setMinDate(System.currentTimeMillis() - 1000);

在您的情况下,日期是 DatePickerDialog

干杯!

【讨论】:

你能解释一下负1000的需要吗 完美运行,谢谢。可能 -1000 是因为您以毫秒为单位获得当前时间 很可能是因为这个 IllegalArgumentException 问题。 ***.com/questions/13661788/…【参考方案5】:

我得到了解决方案。希望对某人有所帮助 静态最终 int DATE_DIALOG_ID = 999;

depart.setOnClickListener(new View.OnClickListener() 

                @Override
                public void onClick(View v) 
                    // TODO Auto-generated method stub
                    showDialog(DATE_DIALOG_ID);

                
            );



protected Dialog onCreateDialog(int id) 
        final Calendar now = Calendar.getInstance();

        switch (id) 
        case DATE_DIALOG_ID:
            // set date picker as current date
            DatePickerDialog _date =   new DatePickerDialog(this, date,myCalendar
                    .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                    myCalendar.get(Calendar.DAY_OF_MONTH))
                @Override
                public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth)
                   
                    if (year < now.get(Calendar.YEAR))

                        view.updateDate(myCalendar
                                .get(Calendar.YEAR), myCalendar
                                .get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));

                    if (monthOfYear < now.get(Calendar.MONTH) && year == now.get(Calendar.YEAR))
                        view.updateDate(myCalendar
                                .get(Calendar.YEAR), myCalendar
                                .get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));

                    if (dayOfMonth < now.get(Calendar.DAY_OF_MONTH) && year == now.get(Calendar.YEAR) && 
                            monthOfYear == now.get(Calendar.MONTH))
                        view.updateDate(myCalendar
                                .get(Calendar.YEAR), myCalendar
                                .get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));
                        
            ;
            return _date;
        
        return null;
    

【讨论】:

以上是关于如何在 DatePickerDialog Android 中禁用今天日期之前的日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 datePickerDialog 中检索值?

Material UI:如何在 DatePicker 之外使用 DatePickerDialog?

如何在 DatePickerDialog Android 中禁用今天日期之前的日期?

如何在 DatePickerDialog Android 中禁用今天日期之后的日期?

如何在按钮单击时显示 DatePickerDialog? [关闭]

如何在 xamarin 表单中更改视觉材料 DatePickerDialog 和 TimePickerDialog 背景颜色