Получить объект Date из DatePickerFragment в Android

Я определил DatePickerFragment в своем приложении для Android, вот его код:

public class DatePickerFragment extends DialogFragment implements
        DatePickerDialog.OnDateSetListener {

    private int year;
    private int month;
    private int day;


    @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);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);

    }

    @Override
    public void onDateSet(DatePicker view, int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public Date getDateFromDatePicker(){
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month, day);
        return calendar.getTime();
    }
}

Я хочу получить дату из этого средства выбора даты из TaskFragment и установить для атрибута date в моем классе Task значение, равное выбранной дате.

        // Method for date picker to appear once the "Due Date" button is clicked.
    datePickerButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentManager fm = getActivity().getFragmentManager();
            DatePickerFragment datePicker = new DatePickerFragment();
            datePicker.show(fm, "datePicker");

            task.setDate(datePicker.getDateFromDatePicker());
           //test
           System.out.println(task.getDate());


        }
    });

При нажатии кнопки появляется окно выбора даты. Однако дата устанавливается неправильно, и фактически устанавливается сразу после нажатия кнопки даты, а не при выборе даты в средстве выбора. Кроме того, при печати даты я получаю следующее, независимо от того, какую дату я выберу: I / System.out: Wed Dec 31 10:47:38 GMT + 00: 00 2 Чтение некоторых решений здесь направило меня на определение onDateSet и getDateFromDatePicker методы, но они не работают правильно. Любая помощь очень ценится, спасибо!


person sums22    schedule 19.01.2017    source источник
comment
Где вы показываете выбор даты в действии?   -  person FrankR    schedule 19.01.2017
comment
Нет во фрагменте с именем TaskFragment.   -  person sums22    schedule 19.01.2017
comment
Я понял, что вызов метода getDateFromDatePicker происходит до вызова метода onDateSet, поэтому я полагаю, что мне нужно взять значения из onDateSet и где-нибудь сохранить их, чтобы к ним мог получить доступ класс TaskFragment.   -  person sums22    schedule 19.01.2017


Ответы (2)


Покопавшись, я последовал методу, который прочитал в книге Программирование на Android: Руководство по ранчо больших ботаников, где четко указано, как передавать данные между двумя фрагментами. Вот шаги, которые я выполнил:

  1. Установка целевого фрагмента: здесь я сделал фрагмент, который получит дату (TaskFragment в моем случае) целевой фрагмент DatePickerFragment через метод setTargetFragment


    // set taskFragment as the target fragment of DatePickerFragment
    datePicker.setTargetFragment(TaskFragment.this, 0);
    datePicker.show(fm, "datePicker");


  1. Отправьте дату в целевой фрагмент с помощью метода onDateSet DatePickerFragment. Я сделал это, передав намерение с датой методу onActivityResult целевого фрагмента.


    public void onDateSet(DatePicker view, int year, int month, int day) {
        // create date object using date set by user
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month, day);
        Date date = calendar.getTime();

        if (getTargetFragment() == null)
            return;

        Intent intent = new Intent();
        intent.putExtra(DATE, date);

        // pass intent to target fragment
        getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intent);


  1. Переопределить метод onActivityResult в целевом фрагменте, чтобы принять дату


    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != Activity.RESULT_OK){
            return;
        }

        if (requestCode == REQUEST_DATE){
            Date date = (Date) data.getSerializableExtra(DatePickerFragment.DATE);
            task.setDate(date);

        }
    }


person sums22    schedule 06.02.2017

При использовании DatePickerFragment у вас обычно есть интерфейс, который запускается, когда пользователь выбирает дату. Это называется DatePickerDialog.OnDateSetListener.

В вашем коде вы показываете средство выбора, а затем сразу устанавливаете дату, а не ждете, пока пользователь выберет. Итак, что вам нужно сделать, это когда срабатывает метод обратного вызова onDateSet, тогда сделайте то, что вы хотите, с датой.

Если вы показываете DatePickerFragment в Activity, один из способов сделать это - создать интерфейс, который позволяет отправлять сообщения из вашего фрагмента в Activity.

person FrankR    schedule 19.01.2017