Android Studio中在Fragment内为绑定DatePicker的Button设置minDate
解决DatePicker设置minDate无效的问题
我来帮你搞定这个给绑定Button的DatePicker设置最小日期的问题!你之前的代码里没有对DatePickerDialog内部的DatePicker实例设置minDate,所以之前的尝试没生效。下面是可行的实现方案,分两种场景:设置固定最小日期(比如当前日期),以及从外部传递最小日期(比如把起始日期作为结束日期的最小限制)。
方案1:设置固定最小日期(比如当前日期)
直接修改你的DatePickerFragment类,在创建DatePickerDialog后获取内部的DatePicker实例,然后设置minDate:
修改后的DatePickerFragment代码
public class DatePickerFragment extends DialogFragment { DatePickerDialog.OnDateSetListener ondateSet; private int year, month, day; public DatePickerFragment() {} public void setCallBack(DatePickerDialog.OnDateSetListener ondate) { ondateSet = ondate; } @SuppressLint("NewApi") @Override public void setArguments(Bundle args) { super.setArguments(args); year = args.getInt("year"); month = args.getInt("month"); day = args.getInt("day"); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), ondateSet, year, month, day); // 获取DatePicker实例并设置最小日期(这里用当前日期为例) DatePicker datePicker = datePickerDialog.getDatePicker(); long currentTime = Calendar.getInstance().getTimeInMillis(); datePicker.setMinDate(currentTime); return datePickerDialog; } }
这样你的日期选择器就只能选择当前及以后的日期了。
方案2:动态传递最小日期(比如起始日期作为结束日期的限制)
如果你的需求是:选择起始日期后,结束日期的选择器不能早于起始日期,那需要在打开结束日期选择器时,把起始日期传递给DatePickerFragment,再设置为minDate。
步骤1:修改DatePickerFragment支持接收minDate参数
public class DatePickerFragment extends DialogFragment { DatePickerDialog.OnDateSetListener ondateSet; private int year, month, day; private long minDate; // 新增存储最小日期的变量 public DatePickerFragment() {} public void setCallBack(DatePickerDialog.OnDateSetListener ondate) { ondateSet = ondate; } @SuppressLint("NewApi") @Override public void setArguments(Bundle args) { super.setArguments(args); year = args.getInt("year"); month = args.getInt("month"); day = args.getInt("day"); // 获取传递的minDate,默认用当前日期 minDate = args.getLong("minDate", Calendar.getInstance().getTimeInMillis()); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), ondateSet, year, month, day); // 设置最小日期 DatePicker datePicker = datePickerDialog.getDatePicker(); datePicker.setMinDate(minDate); return datePickerDialog; } }
步骤2:修改父Fragment代码,传递minDate并完善结束日期选择逻辑
private Button mAwalPeminjaman, mAkhirPeminjaman; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_peminjaman_inventaris, container, false); mAwalPeminjaman = (Button) v.findViewById(R.id.btnAwalPeminjaman); mAkhirPeminjaman = (Button) v.findViewById(R.id.btnAkhirPeminjaman); // 起始日期按钮点击事件 mAwalPeminjaman.setOnClickListener(v1 -> showStartDatePicker()); // 结束日期按钮点击事件 mAkhirPeminjaman.setOnClickListener(v1 -> showEndDatePicker()); return v; } // 打开起始日期选择器 private void showStartDatePicker() { DatePickerFragment date = new DatePickerFragment(); Calendar calender = Calendar.getInstance(); Bundle args = new Bundle(); args.putInt("year", calender.get(Calendar.YEAR)); args.putInt("month", calender.get(Calendar.MONTH)); args.putInt("day", calender.get(Calendar.DAY_OF_MONTH)); date.setArguments(args); date.setCallBack(ondateStart); date.show(getFragmentManager(), "Start Date Picker"); } // 打开结束日期选择器,传递起始日期作为minDate private void showEndDatePicker() { DatePickerFragment date = new DatePickerFragment(); Calendar calender = Calendar.getInstance(); Bundle args = new Bundle(); args.putInt("year", calender.get(Calendar.YEAR)); args.putInt("month", calender.get(Calendar.MONTH)); args.putInt("day", calender.get(Calendar.DAY_OF_MONTH)); // 将起始日期转为毫秒值传递给DatePickerFragment SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); try { Date startDate = sdf.parse(mAwalPeminjaman.getText().toString()); if (startDate != null) { args.putLong("minDate", startDate.getTime()); } else { // 如果起始日期未选择,默认用当前日期 args.putLong("minDate", calender.getTimeInMillis()); } } catch (ParseException e) { e.printStackTrace(); args.putLong("minDate", calender.getTimeInMillis()); } date.setArguments(args); date.setCallBack(ondateEnd); date.show(getFragmentManager(), "End Date Picker"); } // 起始日期选择回调 DatePickerDialog.OnDateSetListener ondateStart = new DatePickerDialog.OnDateSetListener() { public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { mAwalPeminjaman.setText(String.valueOf(year) + "-" + String.valueOf(monthOfYear+1) + "-" + String.valueOf(dayOfMonth)); } }; // 结束日期选择回调 DatePickerDialog.OnDateSetListener ondateEnd = new DatePickerDialog.OnDateSetListener() { public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { mAkhirPeminjaman.setText(String.valueOf(year) + "-" + String.valueOf(monthOfYear+1) + "-" + String.valueOf(dayOfMonth)); } };
关键说明
- 必须获取
DatePickerDialog内部的DatePicker实例才能调用setMinDate(),直接对DatePickerFragment调用是无效的。 setMinDate()的参数是毫秒值,所以需要把日期转成对应的long类型。- 如果需要设置最大日期,可以用类似的方法调用
setMaxDate()。
内容的提问来源于stack exchange,提问作者newbie3
相关产品推荐
相关产品推荐

