这个问题的许多变化都被问到了,我一直在寻找答案,直到我睁着眼睛,但我只是没有看到它。我有一个应用程序/活动,它处理几种类型的计划并调用了一个片段(我将命名为cs2255)来处理特定类型的计划。片段cs2255想要从用户那里获取日期,因此,遵循指南和示例,为了响应按钮单击,它具有以下代码:
public void showDatePickerDialog(View v) {
DialogFragment newFragment = new StartDatePickerFragment();
newFragment.show(getFragmentManager(), "datePicker");
}
StartDatePickerFragment看起来像:
public class StartDatePickerFragment extends DialogFragment
implements DatePickerDialog.OnDateSetListener {
private DatePickedListener mCallBack;
// Our host activity must implement this.
public interface DatePickedListener {
// we call with our return values
public void onDatePicked(int aYear, int aMonth, int aDay);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
}
public void onDateSet(DatePicker view, int pYear, int pMonth,
int pDay) {
// What To Do Here???
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// Makes sure our container/host has implemented
// the callback interface. If not, it throws an exception.
try {
mCallback = (OnDatePickedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnDatePickedListener");
}
}
}
从活动调用相当于StartDatePickerFragment的答案示例相对简单,并使用bundle或callback接口返回结果,但我没有直接从某个活动调用,所以我认为这不起作用。从片段调用它的示例似乎都通过在本地存储或显示数据而不将其传递回调用者来解决问题。我不想将日期选择器逻辑移回基本活动,因为它不需要知道特定时间表的详细信息,或者即使它需要设置日期选择器。但是,如何通过可重复使用的设计完成片段碎片通信?
我已经在代码片段中添加了我过去使用过的片段实际上是由一个活动托管的片段。我实际上并没有尝试过这种技术,因为onAttach方法接收一个Activity参数(启动cs2255的活动),但它不是接口的实现者。片段cs2255将是实现者,因此我相信将抛出ClassCastException。