【发布时间】:2017-07-24 02:30:19
【问题描述】:
我有一个可重复使用的 NumberPickerDialogFragment,可以由活动或片段管理。我读过的每个教程都在 onAttach(Context) 覆盖中分配了侦听器。像这样:
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
listener = (Listener) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString()
+ " must implement Listener");
}
}
显然,如果且仅当片段由活动托管时,这将起作用。但是,如果片段也可以托管在另一个片段中怎么办?我读过 onCreateView 或 onViewCreated 或 onActivityCreated 都可以适用于这种情况。像这样:
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
try {
listener = (Listener) getParentFragment();
} catch (ClassCastException e) {
throw new ClassCastException(getParentFragment().toString()
+ " must implement Listener");
}
return super.onCreateView(inflater, container, savedInstanceState);
}
因此,上述两个代码都涵盖了一种或两种情况,而不是两种情况。现在,由于我的 Fragment 是从 DialogFragment 扩展而来的,因此我有以下代码:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Fragment fragment = getParentFragment();
if (fragment != null) {
try {
listener= (Listener) fragment;
} catch (ClassCastException e) {
throw new ClassCastException(fragment.toString()
+ " must implement Listener");
}
} else {
Activity activity = getActivity();
try {
listener= (Listener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement Listener");
}
}
我只是担心这可能不是最好的方法,考虑到我见过的所有教程都在 onAttach() 覆盖中这样做。
我的问题是:
- 如果 onAttach 是分配主机侦听器的最佳位置,其中侦听器是 Activity,并且
- onCreateView 是分配主机侦听器的最佳位置,其中侦听器是父 Fragment,
- 那么在哪里是分配主机侦听器的最佳位置,其中侦听器既可以是 Activity 也可以是父 Fragment?
【问题讨论】:
标签: android android-fragments android-activity android-dialogfragment