Android: DatePickerDialog во фрагменте, вызываемом другим фрагментом — отправка данных

У меня есть фрагмент, который вызывает другой фрагмент (DialogFragment). Я знаю, что это не лучшая практика, поэтому и спрашиваю.

Во фрагменте 1 у меня есть EditText, который предоставляет диалог выбора даты onClick как фрагмент.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = (LinearLayout)inflater.inflate(R.layout.tab_frag1_layout, container, false);

    EditText dateInput  = (EditText) view.findViewById(R.id.editTextGeb);
    dateInput.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showDatePicker();
        }
    });
    return view;
}

private void showDatePicker() {
    DatePickerFragment date = new DatePickerFragment();

    // set date of today
    Calendar calender = Calendar.getInstance();
    Bundle args = new Bundle();
    args.putInt("year", calender.get(Calendar.YEAR));
    args.putInt("month", calender.get(Calendar.MONTH));
    args.putInt("day", calender.get(Calendar.DAY_OF_MONTH));
    date.setArguments(args);

    date.setCallBack(ondate);
    date.show(getChildFragmentManager(), "Date Picker");
}

OnDateSetListener ondate = new OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        Log.i(TAG, text);
        // here is the place to find the right element
    }
};

А вот и DatePickerFragment:

public class DatePickerFragment extends DialogFragment {
private static final String TAG = "DatePickerFragment";
OnDateSetListener ondateSet;

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

public DatePickerFragment() {}

public void setCallBack(OnDateSetListener ondate) {
    ondateSet = ondate;
}

@Override
public void setArguments(Bundle args) {
    super.setArguments(args);
    year = args.getInt("year");
    month = args.getInt("month");
    day = args.getInt("day");
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    return new DatePickerDialog(getActivity(), ondateSet, year, month, day);
}

Мой вопрос: как мне получить дату из моего DatePickerFragment в мой элемент EditText? Я не могу найти правильный элемент EditText, запросив его через view.findViewById(R.id.editTextGeb);, так как я не в правильном представлении. Нужно ли мне общаться по поводу хостинга? И если да, то есть ли где-нибудь хороший пример?

Я нашел ответ.

На самом деле у меня есть фрагмент, который динамически прикрепляется к FrameLayout (я использую вкладки в своем проекте). Таким образом, я не смог найти его по ID, и мне пришлось вызывать его родительский элемент! Здесь есть хорошее объяснение того, что помогло мне понять проблему: Получить фрагмент, динамически прикрепленный к ‹ Макет рамки›?

Я использую DatePickerFragment, предоставленный Google: http://developer.android.com/guide/topics/ui/controls/pickers.html

В классе активности хоста я реализую DatePickerDialog.OnDateSetListener и переопределяю его метод onDataSet(). Внутри этого метода я вызываю элемент PARENT моего фрагмента, чтобы получить доступ к моему фрагменту.

@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
    Tab1Fragment tab1 = (Tab1Fragment) getSupportFragmentManager().findFragmentById(R.id.realtabcontent);
    EditText et = (EditText) tab1.getView().getRootView().findViewById(R.id.editTextGeb);
    et.setText(day + "." + month + "." + year);
}

Вот и все. Спасибо за помощь. В соответствии с документацией следует избегать прямой связи между фрагментами.


person aszel    schedule 25.07.2013    source источник
comment
После простого поиска в Google я нашел developer.android.com/guide/ тем/ui/controls/pickers.html и stackoverflow.com/questions/11754663/ . Что не так с любым из них?   -  person BLaZuRE    schedule 25.07.2013
comment
Спасибо за Ваш ответ. В этом нет ничего плохого. Ваш ответ заставил меня переосмыслить весь мой код, и я удалил его. Проблема была глубже, и ниже я попытаюсь объяснить, что произошло.   -  person aszel    schedule 25.07.2013


Ответы (1)


Вы должны добавить свой фрагмент № 1 в свой DatePickerFragment в качестве цели. Сюда:

DatePickerFragment datePicker = new DatePickerFragment();
datePicker.setTargetFragment(WhateverClassFragment1Is.this, 0);

А затем в вашем коде DatePickerDialog:

OnDateSetListener ondate = new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
    Log.i(TAG, text);
    WhateverClassFragment1Is target = (WhateverClassFragment1Is) getTargetFragment();
    target.yourHandyMethod(dayOfMonth, monthOfYear, year);
}

};

Надеюсь, это поможет!

person Adrián Rodríguez    schedule 25.07.2013