【问题标题】:Android How to call a fragment method from a DialogFragment positive button clickAndroid 如何从 DialogFragment 正按钮单击调用片段方法
【发布时间】:2012-10-05 03:58:15
【问题描述】:

我已扩展 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的fragment中存在的doPositiveClick()方法?

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

谢谢,

【问题讨论】:

    标签: android android-dialogfragment


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复,是的,看起来我的问题实际上是从对话框 onpositive click 方法中获取片段对象。你知道这是如何实现的吗?
    • 我能够通过 FragmentManager 获取片段(fragmentManager.findFragmentById() 方法)。现在可以使用了,谢谢。
    【解决方案2】:

    我看不到您在调用它之前正在初始化您的界面,您可以通过以下方式实现:

    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");
        }
    }
    

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

    为了避免崩溃,在调用监听器之前总是检查它们是否为空,所以你的代码看起来像这样

    if(mListener != null)
        mListener.doPositiveClick();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 2015-04-23
      • 2015-05-30
      • 2012-05-15
      • 2015-10-01
      • 2013-04-04
      • 1970-01-01
      相关资源
      最近更新 更多