我有一个DialogFragment,它创建一个DatePickerDialog。我正在使用一个名为newInstance
的静态方法来设置初始值,以便使用默认的空构造函数。但是,我应该如何设置监听器?在屏幕旋转之后,当单击“完成”按钮时,监听器不会执行任何操作,因为它不存在。
public class DatePickerFragment extends DialogFragment {
public static final String ARG_YEAR = "year";
public static final String ARG_MONTH = "month";
public static final String ARG_DAY = "day";
private OnDateSetListener listener_;
public static DatePickerFragment newInstance(OnDateSetListener listener, int year, int month, int day) {
final DatePickerFragment date_picker = new DatePickerFragment();
date_picker.setListener(listener);
final Bundle arguments = new Bundle();
arguments.putInt(ARG_YEAR, year);
arguments.putInt(ARG_MONTH, month);
arguments.putInt(ARG_DAY, day);
date_picker.setArguments(arguments);
return date_picker;
}
private void setListener(OnDateSetListener listener) {
listener_ = listener;
}
@Override
public Dialog onCreateDialog(Bundle saved_instance_state) {
final Bundle arguments = getArguments();
final int year = arguments.getInt(ARG_YEAR);
final int month = arguments.getInt(ARG_MONTH);
final int day = arguments.getInt(ARG_DAY);
return new DatePickerDialog(getActivity(), listener_, year, month, day);
}
}
答案 0 :(得分:60)
但是,我应该如何设置监听器?
您使用onCreate
的{{1}}方法更新了侦听器引用:
Activity
并在private OnDateSetListener mOds = new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// do important stuff
}
};
方法中:
onCreate
答案 1 :(得分:7)
在我看来,使用Fragment生命周期有一种更有效的方法。您可以使用Fragment生命周期回调onAttach()
和onDetach()
自动将活动强制转换为监听器,如下所示:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
_listener = (OnDateSetListener)activity;
} catch(ClassCastException e) {
// check if _listener is null before using,
// or throw new ClassCastException("hosting activity must implement OnDateSetListener");
}
}
@Override
public void onDetach() {
super.onDetach();
_listener = null;
}
此技术已正式记录here
答案 2 :(得分:2)
Luksprog的答案是正确的,我只想指出,解决方案的关键是findFragmentByTag()函数。因为活动也将在屏幕旋转后重新创建,所以你不能调用其成员Fragment变量的setter函数,而应该找到具有此函数的旧片段实例。
顺便说一下,当你调用DialogFragment.show()时,标签是第二个参数。