6

我扩展了 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): 在 com.company.app.CustomFieldsFragment$CustomFieldsDialogFragment$1.onClick (CustomFieldsFragment.java:194)

如何调用调用 CustomFieldsFragmentAlertDialog 的片段中存在的 doPositiveClick() 方法?

请注意,android 开发者网站显示了一个示例http://developer.android.com/reference/android/app/DialogFragment.html#AlertDialog使用((FragmentAlertDialog)getActivity()).doPositiveClick(); 但我是从片段而不是活动中调用的。

谢谢,

4

2 回答 2

1

活动正在((FragmentAlertDialog)getActivity()).doPositiveClick();实现接口,以便您可以将活动转换为接口类。

在您的情况下,您希望将目标片段转换为接口,因此您的目标片段必须实现接口,否则它将为您提供ClassCastException。但是你得到了NullPointerExeception确保该getTargetFragment()方法没有返回空对象。

于 2012-10-05T04:53:15.290 回答
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");
    }
}

不要忘记在调用(主机)片段中实现你的监听器,否则它会抛出异常。

为了避免在调用侦听器之前始终检查其是否为 null 的良好做法,因此您的代码将如下所示

if(mListener != null)
    mListener.doPositiveClick();
于 2014-06-04T09:36:18.933 回答