Как передать/получить данные в/из диалогового фрагмента DatePicker

301
05 сентября 2017, 09:00

Есть диалоговый фрагмент:

public class SelectDateFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener
{
    @Override public Dialog onCreateDialog(Bundle savedInstanceState)
    {
    // устанавливаем дату, которая отображается в диалоговом окне
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(getActivity().date_choice_millis);
    int yy = calendar.get(Calendar.YEAR);
    int mm = calendar.get(Calendar.MONTH);
    int dd = calendar.get(Calendar.DAY_OF_MONTH);
    return new DatePickerDialog(getActivity(), this, yy, mm, dd);
    }
    public void onDateSet(DatePicker view, int yy, int mm, int dd)
    {
    // получаем выбранную в диалоговом окне дату и сохраняем ее
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.DAY_OF_MONTH, dd);
    calendar.set(Calendar.MONTH, mm);
    calendar.set(Calendar.YEAR, yy);
    getActivity().date_choice_millis = calendar.getTimeInMillis();
    }
}

И несколько Окон (Activity), обращающихся к нему. В каждом Окне есть метод, вызывающий диалоговый фрагмент:

public void onclick_date_view (View view)
{
    DialogFragment newFragment = new SelectDateFragment();
    newFragment.show(getSupportFragmentManager(), "DatePicker");
    действия после выбора новой даты ...// Возможно, действия после обновления должны происходить в другом месте?
}

Конструкция getActivity().date_choice_millis (переменная из вызвавшего класса) не работает. Как получить и передать данные из/в вызвавшее Окно?

Answer 1

Пример из моего проекта - передача из фрагмента в DatePicker и возврат результата в фрагмент. Способ корректно переносит повороты устройства и тп. бедствия:

UPD: в связи с исключением метода getCalendarView() из Material-стиля календаря переписал получение введенной даты из переданных в колбэк параметров

Класс Date Picker:

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Long mDate = getArguments().getLong("date");
        final Calendar c = Calendar.getInstance();
        c.setTimeInMillis(mDate);
        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);
    }
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        Calendar с = Calendar.getInstance();
        с.set(year,monthOfYear,dayOfMonth);
        long date = c.getTimeInMillis();
        Intent i = new Intent();
        i.putExtra ("date" , date);
        getTargetFragment().onActivityResult(getTargetRequestCode() , Activity.RESULT_OK , i);
    }
}

Часть фрагмента, в котором по нажатию на поле TextView (vDate) появляется Date Picker, получение результата, а так же вывод полученной даты в поле TextView, по которому кликали:

public class EditTransactionFragment extends Fragment {

    private final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
    private TextView vDate;
    private final int CHANGE_DATE = 2;
    Transaction mTransaction;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        if (mTransaction == null) mTransaction = new Transaction();
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        long mDate;
        View view = inflater.inflate(R.layout.edit_transaction, null);
        mDate = mTransaction.getDate();
        vDate = (TextView) view.findViewById(R.id.tr_date);
        vDate.setOnClickListener(new DateClickListener(mDate));
        setTextDate(mDate);
        return view;
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (data == null || resultCode != Activity.RESULT_OK) return;
        switch (requestCode) {
            case CHANGE_DATE:
                Long date = data.getLongExtra("date", 0);
                mTransaction.setDate(date);
                setTextDate(date);
                return;
        }
    }
    private void setTextDate(Long date) {
        vDate.setText(dateFormat.format(date));
    }

    private class DateClickListener implements View.OnClickListener {
        private long mDate;
        public DateClickListener(long date) {
            mDate = date;
        }
        @Override
        public void onClick(View v) {
            DialogFragment changeDate = new DatePickerFragment();
            Bundle args = new Bundle(1);
            args.putLong("date", mDate);
            changeDate.setArguments(args);
            changeDate.setTargetFragment(EditTransactionFragment.this, CHANGE_DATE);
            changeDate.show(getFragmentManager(), "changeDate");
        }
    }
}
READ ALSO
Есть приложение на IONIC. Как сделать условие?

Есть приложение на IONIC. Как сделать условие?

Как сделать условие if !logged в IONIC Framework? Например мне нужно, чтобы в приложении человек который не залогинен видел одну информацию, а именно...

184