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