我扩展了DialogFragment并从Fragment调用它(使用支持库,例如.android.support.v4.app.Fragment)
Fragment实现包含doPositiveClick()方法的以下接口。
public interface CustomFieldsFragmentAlertDialog {
public abstract void doPositiveClick();
}
要显示对话框,请致电:
CustomFieldsDialogFragment dialog = CustomFieldsDialogFragment.newInstance();
dialog.show(getFragmentManager(), "fragmentDialog");
这是我的DialogFragment类
public static class CustomFieldsDialogFragment extends DialogFragment{
public static CustomFieldsDialogFragment newInstance() {
CustomFieldsDialogFragment frag = new CustomFieldsDialogFragment();
return frag;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Title");
builder.setPositiveButton(posButtonText, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
((CustomFieldsFragmentAlertDialog)getTargetFragment()).doPositiveClick();
}
});
}
return builder.create();
}
}
当尝试执行((CustomFieldsFragmentAlertDialog)getTargetFragment())时,应用程序崩溃并出现空指针异常.doPositiveClick();
10-05 13:45:23.550:E / AndroidRuntime(29228): java.lang.NullPointerException 10-05 13:45:23.550: E / AndroidRuntime(29228):at com.company.app.CustomFieldsFragment $ $ CustomFieldsDialogFragment 1.onClick(CustomFieldsFragment.java:194)
如何调用调用CustomFieldsFragmentAlertDialog的片段中存在的doPositiveClick()方法?
注意,android开发者网站显示了一个使用((FragmentAlertDialog)getActivity())行的示例http://developer.android.com/reference/android/app/DialogFragment.html#AlertDialog。doPositiveClick(); 但我正在从片段调用,不是活动。
谢谢,
答案 0 :(得分:1)
在((FragmentAlertDialog)getActivity()).doPositiveClick();
行中,活动正在实现接口,以便您可以将活动强制转换为接口类。
在您的情况下,您希望将目标片段转换为Interface,以便您的目标片段必须实现接口,否则它将为您提供ClassCastException
。但是你得到了NullPointerExeception
,以确保getTargetFragment()
方法没有返回空对象。
答案 1 :(得分:0)
我无法在调用之前初始化您的界面,您可以按如下方式实现:
CustomFieldsFragmentAlertDialog mListener;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception.
try {
mListener = (CustomFieldsFragmentAlertDialog) getFragmentManager().findFragmentByTag(hostFragmentTag);
} catch (ClassCastException e) {
throw new ClassCastException(getFragmentManager()
.findFragmentByTag(hostFragmentTag).toString()
+ " must implement CustomFieldsFragmentAlertDialog");
}
}
不要忘记在调用(主机)片段中实现监听器, 否则会引发异常。
为了避免崩溃它的好习惯,在调用之前总是检查Listeners是否为null,所以你的代码看起来像这样
if(mListener != null)
mListener.doPositiveClick();