Android如何从DialogFragment正向按钮单击调用片段方法

Dit*_*mon 6 android android-dialogfragment

我扩展了DialogFragment并从Fragment调用它(使用支持库,例如android.support.v4.app.Fragment)

Fragment实现包含doPositiveClick()方法的以下接口.

public interface CustomFieldsFragmentAlertDialog {
    public abstract void doPositiveClick();
}
Run Code Online (Sandbox Code Playgroud)

为了显示对话框,我打电话给:

CustomFieldsDialogFragment dialog = CustomFieldsDialogFragment.newInstance();
dialog.show(getFragmentManager(), "fragmentDialog");
Run Code Online (Sandbox Code Playgroud)

这是我的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();

        }       
    }
Run Code Online (Sandbox Code Playgroud)

尝试执行该行时,应用程序崩溃并出现空指针异常((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开发人员站点显示了一个示例http://developer.android.com/reference/android/app/DialogFragment.html#AlertDialog,它使用了行((FragmentAlertDialog)getActivity()).doPositiveClick(); 但我是从片段而不是活动中呼唤的.

谢谢,

Dha*_*dra 1

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

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

  • 我能够通过 FragmentManager (fragmentManager.findFragmentById() 方法)获取片段。现在可以用了,谢谢。 (3认同)