我希望当用户点击Duedate EditText时,他们会得到一个日期选择器对话框,其默认日期设置为今天。他们选择的日期将减去280天,结果日期将设置到另一个名为Lastperiod的EditText中。问题是,当用户第一次点击EditText时,它工作正常。但是,如果他们尝试再次选择日期,则Duedate和LastPeriod文本视图不会更改。必须点击EditText才能显示更改。更糟糕的是,出现的日期不断减少。请帮助我找到我的逻辑错误,即使用户想要重新选择日期,日历也不必从280天后重新开始。
我试图将日期重置为今天,这是单击EditText时的第一件事,但仍然无法正常工作。
Duedate = (EditText) findViewById(R.id.due_date);
LastPeriod = (EditText) findViewById(R.id.last_period);
Duedate.setOnClickListener(this);
LastPeriod.setOnClickListener(this);
date = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month,
int dayOfMonth) {
view.setMinDate(System.currentTimeMillis());
myCalendar.set(Calendar.YEAR, year);
myCalendar.set(Calendar.MONTH, month);
myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
用于从所选日期扣除280天的功能。
public void Deduct_Date(){
myCalendar.add(Calendar.DATE,-280);
String myFormat = "dd/MMMM/yyyy";
SimpleDateFormat sdf;
sdf = new SimpleDateFormat( myFormat);
LastPeriod.setText(sdf.format(myCalendar.getTime()));
}
将日期重置为今天日期的功能。
public void ResestDatetoToday() {
date = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
view.setMinDate(System.currentTimeMillis());
myCalendar.set(Calendar.YEAR, year);
myCalendar.set(Calendar.MONTH, month);
myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
}
};
}
点击监听器的实现
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.due_date:
new DatePickerDialog(DateActivity.this,date,myCalendar.get(Calendar.YEAR),myCalendar.get(Calendar.MONTH),myCalendar.get(Calendar.DAY_OF_MONTH)).show();
ResestDatetoToday();
String myFormat = "dd/MMMM/yyyy";
SimpleDateFormat sdf = new SimpleDateFormat( myFormat);
Duedate.setText(sdf.format(myCalendar.getTime()));
//LastPeriod.setText(sdf.format(myCalendar.getTime()));
Deduct_Date();
break;
}
除用户单击“ DueDate”编辑文本的单击外,他们可以选择默认日期为今天的日期。效果很好。但是,当用户想要选择除今天日期以外的其他日期时,除非再次点击会产生280天的日期,否则它不会反映在“编辑”文本上。它不是从今天开始。
答案 0 :(得分:0)
根据我对代码的了解,两个监听器都使用相同的变量 date 。因此,该变量将被设置为新的侦听器,从而行为异常。
尝试以下提到的方法:
步骤1:创建一个名为 DateTimeUtility
的类 public class DateTimeUtility {
public static final String DATE_FORMAT = "dd/MM/yyyy";
public static void showDatePicker(Context context, DateTimeListener dateTimeListener, long dateTime) {
if (context == null || dateTimeListener == null) return;
Calendar myCalendar = Calendar.getInstance();
if (dateTime > 0)
myCalendar.setTimeInMillis(dateTime);
DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) {
myCalendar.set(Calendar.YEAR, year);
myCalendar.set(Calendar.MONTH, monthOfYear);
myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
dateTimeListener.onDateTime(myCalendar.getTimeInMillis());
}
};
new DatePickerDialog(context, date, myCalendar
.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH)).show();
}
public interface DateTimeListener {
void onDateSelected(long dateTime);
}
public static String getFormattedDateTime(Long time, String format) {
if (time == null) {
return String.valueOf(0);
}
try {
SimpleDateFormat dateFormat = new SimpleDateFormat(format);
return dateFormat.format(time);
} catch (Exception e) {
return String.valueOf(0);
}
}
}
步骤2:使用活动/片段中的课程。在片段/活动中:
private long selectedDate = System.currentTimeMillis();
Duedate = (EditText) findViewById(R.id.due_date);
LastPeriod = (EditText) findViewById(R.id.last_period);
Duedate.setOnClickListener(this);
LastPeriod.setOnClickListener(this);
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.due_date:
DateTimeUtility.showDatePicker(mContext, new DateTimeUtility.DateTimeListener() {
@Override
public void onDateSelected(long dateTime) {
DueDate.setText(DateTimeUtility.getFormattedDateTime(dateTime, DateTimeUtility.DATE_FORMAT));
selectedDate = dateTime;
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(selectedDate);
calendar.add(Calendar.DATE, -280);
LastPeriod.setText((DateTimeUtility.getFormattedDateTime(calendar.getTimeInMillis(), DateTimeUtility.DATE_FORMAT)));
}
}, selectedDate);
break;
}