日期选择器对话框。设置无效日期时如何重新打开它
DatepickerDialog. How to reopen it when invalid date set
好的。所以我制作了一个日期选择器对话框,该对话框在 TextView Click 上打开。这部分工作正常。当我有 2 个约会时,我的问题就发生了。如果第二个日期早于第一个日期,则日期选择器应重新打开并请求新的 "valid" 日期。这就是我遇到问题的地方。我现在的代码(如下)告诉我日期是否错误,但不会重新打开日期选择器以允许我设置新日期。我该怎么做呢?我尝试制作一种新方法,并在其中使用不同的日期选择器对话框使用相同的代码,但是将 2 个日期选择器重叠在一起并且选择的日期始终来自第二个。
public void onClick(final View v) {
final Calendar date =Calendar.getInstance();
int dateyear=date.get(Calendar.YEAR);
int datemonth=date.get(Calendar.MONTH);
int dateday=date.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dp=new DatePickerDialog(AddClaim.this, new OnDateSetListener() {
public void onDateSet(DatePicker datepicker, int selectedyear, int selectedmonth, int selectedday) {
int month = selectedmonth;
date.set(selectedyear, month, selectedday);
Date myDate = date.getTime();
String returnDate = finalDate.format(myDate);
if (call){
sdate_field.setText(returnDate);
try {
sdate = finalDate.parse(returnDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
try {
if (finalDate.parse(returnDate).before(sdate)){
Toast.makeText(AddClaim.this, "End date cannot be before Start date", Toast.LENGTH_LONG).show(); //after this a new datepickerdialog should open....
}else{
edate_field.setText(returnDate);
}
} catch (ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
edate = finalDate.parse(returnDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
},dateyear, datemonth, dateday);
if (call){
dp.setTitle("Select Start Date");
}else{
dp.setTitle("Select End Date");
}
dp.show();
}
创建一个布尔值字段
boolean isValid;
从 onDateSet 方法更新它。如果所选日期有效,则将其设置为 true,否则将其设置为 false.
并检查布尔字段的状态并在必要时重新实例化选取器。
最重要的是,我建议您为选择器创建一个新的 class。
正在更新...
public static class AppDatePickerDialog extends DialogFragment
implements DatePickerDialog.OnDateSetListener {
private int mYear, mMonth, mDay;
private String sMonth;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new DatePickerDialog(getActivity(), this, mYear, mMonth, mDay);
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//you logic to set the field to true or false
}
}
因此,要打开选择器,您可以执行以下操作
AppDatePickerDialog datePicker = new AppDatePickerDialog();
datePicker.show(getSupportFragmentManager(), "YOUR_TAG");
如果你想根据布尔字段重新打开选择器,你可以将上面的两行 inside onDateSet 方法。
编辑
在 onDateSet 方法中放入以下内容:
if (!isValid) {
AppDatePickerDialog datePicker = new AppDatePickerDialog();
datePicker.show(getSupportFragmentManager(), "YOUR_TAG");
}
好的。所以我制作了一个日期选择器对话框,该对话框在 TextView Click 上打开。这部分工作正常。当我有 2 个约会时,我的问题就发生了。如果第二个日期早于第一个日期,则日期选择器应重新打开并请求新的 "valid" 日期。这就是我遇到问题的地方。我现在的代码(如下)告诉我日期是否错误,但不会重新打开日期选择器以允许我设置新日期。我该怎么做呢?我尝试制作一种新方法,并在其中使用不同的日期选择器对话框使用相同的代码,但是将 2 个日期选择器重叠在一起并且选择的日期始终来自第二个。
public void onClick(final View v) {
final Calendar date =Calendar.getInstance();
int dateyear=date.get(Calendar.YEAR);
int datemonth=date.get(Calendar.MONTH);
int dateday=date.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dp=new DatePickerDialog(AddClaim.this, new OnDateSetListener() {
public void onDateSet(DatePicker datepicker, int selectedyear, int selectedmonth, int selectedday) {
int month = selectedmonth;
date.set(selectedyear, month, selectedday);
Date myDate = date.getTime();
String returnDate = finalDate.format(myDate);
if (call){
sdate_field.setText(returnDate);
try {
sdate = finalDate.parse(returnDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
try {
if (finalDate.parse(returnDate).before(sdate)){
Toast.makeText(AddClaim.this, "End date cannot be before Start date", Toast.LENGTH_LONG).show(); //after this a new datepickerdialog should open....
}else{
edate_field.setText(returnDate);
}
} catch (ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
edate = finalDate.parse(returnDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
},dateyear, datemonth, dateday);
if (call){
dp.setTitle("Select Start Date");
}else{
dp.setTitle("Select End Date");
}
dp.show();
}
创建一个布尔值字段
boolean isValid;
从 onDateSet 方法更新它。如果所选日期有效,则将其设置为 true,否则将其设置为 false.
并检查布尔字段的状态并在必要时重新实例化选取器。
最重要的是,我建议您为选择器创建一个新的 class。
正在更新...
public static class AppDatePickerDialog extends DialogFragment
implements DatePickerDialog.OnDateSetListener {
private int mYear, mMonth, mDay;
private String sMonth;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new DatePickerDialog(getActivity(), this, mYear, mMonth, mDay);
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//you logic to set the field to true or false
}
}
因此,要打开选择器,您可以执行以下操作
AppDatePickerDialog datePicker = new AppDatePickerDialog();
datePicker.show(getSupportFragmentManager(), "YOUR_TAG");
如果你想根据布尔字段重新打开选择器,你可以将上面的两行 inside onDateSet 方法。
编辑
在 onDateSet 方法中放入以下内容:
if (!isValid) {
AppDatePickerDialog datePicker = new AppDatePickerDialog();
datePicker.show(getSupportFragmentManager(), "YOUR_TAG");
}