我有一个调用另一个片段的片段(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元素中?由于我的观点不正确,我无法通过view.findViewById(R.id.editTextGeb);
请求找到正确的EditText元素。
我是否需要通过托管活动进行沟通?如果有,那么某处有一个很好的例子吗?
我找到了答案。
我实际拥有的是一个动态附加到FrameLayout的片段(我在项目中使用了制表符)。因此我无法通过ID找到它并且不得不调用它的父元素!有一个很好的解释是什么帮助我理解这个问题:Get Fragment dynamically attached to <FrameLayout>?
我使用Google提供的DatePickerFragment:http://developer.android.com/guide/topics/ui/controls/pickers.html
在host活动类中,我实现了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);
}
就是这样。谢谢你的帮助。根据文档,可以避免直接片段到片段的通信。
答案 0 :(得分: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);
}
};
希望有所帮助!