У меня есть фрагмент, который вызывает другой фрагмент (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);
}
Вот и все. Спасибо за помощь. В соответствии с документацией следует избегать прямой связи между фрагментами.