【问题标题】:How do I show the previously selected date in a DatePickerDialog on next call?如何在下次调用时在 DatePickerDialog 中显示先前选择的日期?
【发布时间】:2015-12-19 01:26:31
【问题描述】:

DatePickerDialog 被加载到 Fragment 中,当对话框首次打开时,今天的显示是默认日期。然后用户选择一个日期,然后关闭对话框。下次重新打开时,如何将之前选择的日期显示为默认日期,而不是显示今天的日期?

我在 Activity 中尝试过 .set() 但不知道如何使用 .get() 来检索片段中的日期。我已经尝试在 Activity 和 Fragment 之间使用侦听器的接口,但无法使其正常工作,而且对于我试图实现的简单任务来说似乎过于复杂。我已经尝试过从 Activity 发送到片段的捆绑包,但我也无法让它工作。请指教。

活动文件:

...
final Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, day);
DialogFragment newFragment = new DatePickerFragment();
newFragment.show(getSupportFragmentManager(), "datePicker");

片段文件:

...
public static class DatePickerFragment extends DialogFragment
                        implements DatePickerDialog.OnDateSetListener {

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // Use the current date as the default date in the picker
    final Calendar c = Calendar.getInstance();
    int year = c.get(Calendar.YEAR);
    int month = c.get(Calendar.MONTH);
    int day = c.get(Calendar.DAY_OF_MONTH);

    return new DatePickerDialog(getActivity(), this, year, month, day);
}

public void onDateSet(DatePicker view, int year, int month, int day) {
    // Save selected date in a date variable here?  How?
    // How do I then use the date variable in onCreateDialog
    // rather than the get(Calendar) code that returns today's date? 
}

}

【问题讨论】:

  • 将其保存到一个变量中,并在再次打开对话框时将选择器设置为您的日期变量。
  • 您应该将值保存在 SharedPreferences 中。这是在应用程序的多次打开和关闭之间保存隔离值的适当 Android api。
  • @sean 该线程的哪一部分?我设置了一个监听器,但它不起作用,而且看起来过于复杂。
  • @David 首先,我需要将今天的日期显示为默认日期......我可以轻松做到(参见上面的片段代码)。在下一次打开时,我需要使用之前选择的日期设置选择器。你能提供一个我可以尝试的例子吗?

标签: android date android-fragments


【解决方案1】:

获取具有默认今天日期的 DatePicker:

@SuppressLint("SimpleDateFormat")
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
private Calendar calendar = null;

int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
OnDateSetListener dateSetListener = new OnDateSetListener() {

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
calendar.set(year, monthOfYear, dayOfMonth);
//this line save-s the DatePicker selected date to the edittext
//you can try with:  Date dpDate =new Date(sdf.format(calendar.getTime();
birthDate.setText(sdf.format(calendar.getTime()));
}
};

final DatePickerFragment datePickerFragment = new DatePickerFragment(StepSettingsView.this, dateSetListener, year, month, day);
datePickerFragment.getDatePicker().setMaxDate(new Date().getTime());
datePickerFragment.show();
                    datePickerFragment.getButton(DatePickerDialog.BUTTON_NEUTRAL).setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
birthDate.setText("");
datePickerFragment.dismiss();
}
});

【讨论】:

    【解决方案2】:

    在 Bundle 中,您应该发送年月日值并在此处检索,例如:

    @Override
    public Dialog onCreateDialog(Bundle mBundle) {
    
        int year = mBundle.getInt("YEAR");
        int month =  mBundle.getInt("MONTH");
        int day =  mBundle.getInt("DAY");
    
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }
    
    public void onDateSet(DatePicker view, int year, int month, int day) {
        // Save selected date in a date variable here?  How?
        // How do I then use the date variable in onCreateDialog
        // rather than the get(Calendar) code that returns today's date? 
    }
    

    您需要从我们调用此日期时间选择器片段的位置发送此捆绑包。

    【讨论】:

      【解决方案3】:

      全局声明

      private DatePicker datepicker;
      

      复制粘贴到下面的函数

         private void selectDate() {
      
          final DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(),
                  new DatePickerDialog.OnDateSetListener() {
      
                      @Override
                      public void onDateSet(DatePicker view, int year,
                                            int monthOfYear, int dayOfMonth) {
      
                          datepicker = new DatePicker(getActivity());
      
                          datepicker.init(year, monthOfYear + 1, dayOfMonth, null);
      
      
                      }
                  }, mYear, mMonth, mDay);
      
          if (datepicker != null) {
              datePickerDialog.updateDate(datepicker.getYear(), datepicker.getMonth() - 1, datepicker.getDayOfMonth());
      
          }
          datePickerDialog.show();
      }
      

      【讨论】:

        【解决方案4】:

        如果我关注你的问题而不是将日期放在sharedPreferences

        public void onDateSet(DatePicker view, int year, int month, int day) {
        // here put you date to shared preference in get later//
        // you can convert it to time stamp and easily save
        }
        

        通过使用sharedPreferences,您可以在应用程序中设置任何位置并获取任何位置。

        【讨论】:

          【解决方案5】:

          请收下

          private String lastStoredDate;
          
          
              if(lastStoredDate == null || lastStoredDate.trim().length() == 0){
                  lastStoredDate = getCurrentDate("MM/dd/yyyy");
              }
              String dobSplit[] = lastStoredDate.split("/");
              Calendar calendar = Calendar.getInstance();
              calendar.set(Integer.parseInt(dobSplit[2]), Integer.parseInt(dobSplit[0]), Integer.parseInt(dobSplit[1]));
              int iDay=calendar.get(Calendar.DATE);
              int iMonth=calendar.get(Calendar.MONTH)-1;
              int iYear=calendar.get(Calendar.YEAR);
              DatePickerDialog dbDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
                  @Override
                  public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                      StringBuilder date = new StringBuilder();
          
                      monthOfYear = monthOfYear + 1;
                      if (monthOfYear < 10) {
                          date.append("0"+monthOfYear+"/"+dayOfMonth);
                      }else{
                          date.append(monthOfYear).append("/"+dayOfMonth);
                      }
                      date.append("/"+year);
                    lastStoredDate = date.toString();
                  }
              },iYear,iMonth,iDay);
              dbDialog.getDatePicker().setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS);
          
              dbDialog.show();
          

          //获取当前日期

              public static String getCurrentDate(String format) {
              SimpleDateFormat sdf = new SimpleDateFormat(format);
              String formattedDate = sdf.format(Calendar.getInstance().getTime());
              return formattedDate;
              }
          

          【讨论】:

          • 谢谢。您根本不显示“onCreateDialog”方法。是否不需要,因为您使用“dbDialog.show();” ?
          • 你的工作完成了吗? split 方法用于获取日历中设置的年月日
          • 我在 Android Studio 中加载了您建议的代码,我有大约 25 个投诉...必须是抽象的,lastStoredDate 是未知类,不喜欢 calendar.set 或 parseInt。无法解决 OnDateSetListener、预期的类或接口以及其他一些问题……我无法自己诊断所有这些问题。
          【解决方案6】:
          First of all this code is working on `edittext` or any button to set previous and current date in to Date picker.                
          
          public class AboutMeActivity extends AppCompatActivity {
          
          DatePickerDialog datePickerDialog;
          private TextInputEditText   edtDateOfBirth;
          private int mYear;
          private int mMonth;
          private int mDay;
          
          private  View.OnClickListener edtDateOfBirthClickListener    =   new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                  datePickerDialog = new DatePickerDialog(AboutMeActivity.this, new DatePickerDialog.OnDateSetListener() { 
          
                 @Override
                 public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
          
                    //here i=year,i1= month,i2=days.
          
                      mYear =i;
                      mMonth=i1;
                      mDay=i2;
          
                      edtDateOfBirth.setText(i2 + "-" + (i1 + 1) + "-" + i);
                 }
          
              }, mYear, mMonth, mDay);
          
             datePickerDialog.show();
           }};                     
          
            @Override
            protected void onCreate(Bundle savedInstanceState) {
               super.onCreate(savedInstanceState);            
                 edtDateOfBirth = (TextInputEditText)findViewById(R.id.edtDateOfBirth);     if(edtDateOfBirth!=null)edtDateOfBirth.setOnClickListener(edtDateOfBirthClickListener);  
          
            Calendar c = Calendar.getInstance();
            mYear = c.get(Calendar.YEAR); // current year
            mMonth = c.get(Calendar.MONTH); // current month
            mDay = c.get(Calendar.DAY_OF_MONTH); //current Day.       
          
          }
          
          }
          

          【讨论】:

            【解决方案7】:

            我的编辑文本字段显示当前日期,并通过从编辑文本字段中获取值并更新日期选择器对话框,在下次打开 Datepicker Dailog 时更新上次选择的日期。

            我对我在编辑文本字段中设置的点击功能有一个非常详细的解释。

            我已经发布了整个函数,你可以从 cmets 中看到哪些部分可以用来解决你的问题

            注意:我没有捕获空值,因为我在编辑文本视图中默认显示当前日期。

              public void setDateDialog(View view) {
                // Edit text field which on click opens the Datepicker Dialog
                final EditText eText = findViewById(R.id.timeField);
                // Get the current value in the edit text field
                String userInput = eText.getText().toString();
                // Remove the date seprators
                String[] dateParts = userInput.split("/");
                // Day String
                String dayStr = dateParts[0];
                // Month String
                String monthStr = dateParts[1];
                // Year String
                String yearStr = dateParts[2];
                // Day String to integer
                final int dayInt = Integer.parseInt(dayStr);
                // Month String to integer ( Substarct 1 as month as count starts from 0)
                final int monthInt = Integer.parseInt(monthStr)-1;
                // Year String to integer
                final int yearInt  = Integer.parseInt(yearStr);
                // Initialise the calender
                final Calendar cldr = Calendar.getInstance();
                int day = cldr.get(Calendar.DATE);
                int month = cldr.get(Calendar.MONTH);
                int year = cldr.get(Calendar.YEAR);
            
                DatePickerDialog pickerDialog = new DatePickerDialog(QuickLaunch.this, R.style.DatePickerTheme, new DatePickerDialog.OnDateSetListener() {
                    @Override
                    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                       // Adding Zero before month if month is single digit
                        int month = monthOfYear + 1;
                        String fm = "" + month;
                        String fd = "" + dayOfMonth;
                        if (month < 10) {
                            fm = "0" + month;
                        }
                        if (dayOfMonth < 10) {
                            fd = "0" + dayOfMonth;
                        }
                        eText.setText(fd + "/" + (fm) + "/" + year);
                    }
                }, year, month, day);
                // Set the maximum date till tommorrow
                pickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis() + (1000 * 60 * 60 * 24 * 1));
                // Set the minimun date till yesterday
                pickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - (1000 * 60 * 60 * 24 * 1));
                //Set the previous date in datepicker
                pickerDialog.getDatePicker().init(yearInt,monthInt,dayInt,null);
                pickerDialog.show();
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-08-22
              • 2022-11-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多