Страницы

Поиск по вопросам

воскресенье, 22 декабря 2019 г.

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

#java #android #android_fragment #dialogfragment


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

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 (переменная из вызвавшего класса) не
работает. Как получить и передать данные из/в вызвавшее Окно?
    


Ответы

Ответ 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"); } } }

Комментариев нет:

Отправить комментарий