如何解决选择今天的日期,从日期中减去几天并将日期添加到EditText的问题

时间:2019-02-11 07:38:39

标签: java android

我希望当用户点击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天的日期,否则它不会反映在“编辑”文本上。它不是从今天开始。

1 个答案:

答案 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;
        }