2015-09-21 2 views
0

У меня есть DatePickerDialog, который открывается во фрагменте. При первом открытии в диалоговом окне по умолчанию отображается текущая дата. Затем пользователь выбирает дату. Когда диалог отклоняется, я устанавливаю строку EditText с выбранной пользователем датой.Как получить интерфейс Bundle для доставки предыдущей даты DatePickerDialog?

В следующий раз, когда открывается диалоговое окно (потому что пользователь хочет отредактировать ранее выбранную дату), я хочу показать ранее выбранную дату пользователя как дату по умолчанию, а не сегодняшнюю дату. Я установил интерфейс из фрагмента в действие с помощью Bundle. Кроме того, не уверен, что мой тест пустоты на «год» в Fragment OnCreateDialog работает правильно. Пожалуйста, порекомендуйте.

частичный файл DatePickerFragment:

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { 

private int currentyear; 
private int currentmonth; 
private int currentday; 

public DatePickerFragment() { 
} 

public interface OnDateEnteredListener { 
    void OnDateEntered(int year, int month, int day); 
} 
OnDateEnteredListener mListener; 


// Set up a Calendar object that will capture the current date for the DatePickerDialog to use. 
Calendar cal = Calendar.getInstance(); 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    final Bundle datebundle = this.getArguments(); 
    currentyear = datebundle.get(Calendar.YEAR); 
    currentmonth = datebundle.get(Calendar.MONTH); 
    currentday = datebundle.get(Calendar.DAY_OF_MONTH); 

if(currentyear != 0){ 
     DatePickerDialog dateDialog = new DatePickerDialog(this.getActivity(), this, currentyear, currentmonth, currentday); 
     dateDialog.getDatePicker().setCalendarViewShown(true); 
     dateDialog.getDatePicker().setSpinnersShown(false); 
     dateDialog.setTitle("Select a Due Date"); 
     return dateDialog; 
    } 
    else { 
     // Create three variables to capture the current date. 
     currentyear = cal.get(Calendar.YEAR); 
     currentmonth = cal.get(Calendar.MONTH); 
     currentday = cal.get(Calendar.DAY_OF_MONTH); 
     // Create a DatePickerDialog which is a simple dialog containing a DatePicker. Use the current date 
     // as the default date in the DatePicker. The new instance of DatePickerDialog is created by passing 
     // 5 parameters/arguments to the constructor and returning it. 
     DatePickerDialog dateDialog = new DatePickerDialog(this.getActivity(), this, currentyear, currentmonth, currentday); 
     dateDialog.getDatePicker().setCalendarViewShown(true); 
     dateDialog.getDatePicker().setSpinnersShown(false); 
     dateDialog.setTitle("Select a Due Date"); 
     return dateDialog; 
    } 
} 


public void onDateSet (DatePicker view,int year, int month, int day) { 
    mListener.OnDateEntered(year,month,day); 
... 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
} 

частичный файл активность:

public class Activity extends AppCompatActivity implements DatePickerFragment.OnDateEnteredListener { 

    int currentyear; 
    int currentmonth; 
    int currentday; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.input); 

    fListenerEditText = (ListenerEditText) findViewById(R.id.FEditText); 

    fListenerEditText.setOnFocusChangeListener(new OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
     if (hasFocus && (fListenerEditText.getText().length() == 0)) { 
     DialogFragment newFragment = new DatePickerFragment(); 
     Bundle datebundle = new Bundle(); 
       datebundle.putInt("YEAR", currentyear); 
       datebundle.putInt("MONTH", currentmonth); 
       datebundle.putInt("DAY", currentday); 
       newFragment.setArguments(datebundle); 
       newFragment.show(getSupportFragmentManager(), "datePicker"); 
      } 
     } 
    }); 

    @Override 
    public void onDateEntered(int year, int month, int day) { 
    Toast toast = Toast.makeText(getApplicationContext(), "Test", Toast.LENGTH_LONG); 
    toast.show(); 
    } 
} 
+0

Перед тем, как вызвать диалог, вы должны получить дату из 'EditText', разобрать текст на сегодняшний день и установить его на текущую дату, то в вашем диалоге' OnCreate() 'просто получить текущую дату –

+0

Хорошо, но как бы я это сделал? При первом создании диалога EditText пуст, и я хочу показать сегодняшнюю дату. Затем пользователь выбирает дату. В следующий раз, когда пользователь захочет отредактировать ранее выбранную дату, я смогу использовать EditText. Но как бы я сделал в onCreate()? – AJW

+1

В первый раз, когда вы запускаете, вы просто вызываете диалог и диалоговое окно с сегодняшней датой, которое вы уже объявили внутри своего оператора else. Это все для диалога. Затем пользователь выбирает дату, вы устанавливаете 'EditText' на выбранную дату. Что означает, что ваш фрагмент диалога не должен проверять предыдущую дату, просто покажите дату get из cal.get (Calendar.YEAR), месяц и день. Поскольку вы можете установить текущую дату, используя cal.set(), прежде чем открыть диалог –

ответ

1
  1. Если предыдущая дата не найдена, показать диалоговое окно вместе с сегодняшним днем, используя cal.get()

  2. пользователя выберите дату, установите EditText на da т. е. выбран.

  3. Если предыдущая дата, обнаруженная, разобрать текст из EditText в формат даты, установите его на текущую дату с помощью cal.set() и отображения диалогового окна с помощью cal.get()

Вы можете проверить, является ли EditText пуст, используя .matches() метод.

Например,

if(txtDate.getText().toString().matches("")) 
     // txtDate was empty 
+0

Хорошо, я попробую. – AJW

+0

Если EditText пуст (ранее не выбрана дата), тогда мне не нужно будет использовать currentyear = cal.set (Calendar.YEAR); currentmonth = cal.set (Calendar.MONTH); и currentday = cal.set (Calendar.DAY_OF_MONTH); установить сегодняшнюю дату в диалоговом окне? вы упомянули, что диалог по умолчанию получит сегодняшнюю дату. – AJW

+0

Ya, нет необходимости устанавливать его, он будет получать сегодняшнюю дату по умолчанию. –