Java 未调用DialogFragment OnDismissListener

Java 未调用DialogFragment OnDismissListener,java,android,Java,Android,我刚刚做了一个构建,注意到我的代码不起作用,在设置了一些断点之后,我看到,实际上,discover();方法被调用,但问题是没有调用侦听器,因此侦听器中的代码永远不会执行。 我有我的片段A,在这里我显示了我的DialogFragment(DateDialog),当DateDialog被取消时,我有权从片段A中获取一些DateDialog值,但它不起作用。 这是我的原始代码,它不起作用: //DATEDIALOG @Nullable @Override public View o

我刚刚做了一个构建,注意到我的代码不起作用,在设置了一些断点之后,我看到,实际上,discover();方法被调用,但问题是没有调用侦听器,因此侦听器中的代码永远不会执行。 我有我的片段A,在这里我显示了我的DialogFragment(DateDialog),当DateDialog被取消时,我有权从片段A中获取一些DateDialog值,但它不起作用。 这是我的原始代码,它不起作用:

//DATEDIALOG
@Nullable
    @Override

    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.datedialog, container, false);

        localf = android.text.format.DateFormat.getMediumDateFormat(getContext());

         TomorrowB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                setTomorrow();
                HasDate = true;
                dismiss();
            }
        });

        return v;
    }

//FRAGMENT A
DateB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final DateDialog d = new DateDialog();
                d.show(getChildFragmentManagaer(), "DateDialog");
                getChildFragmentManager().executePendingTransactions();
                d.getDialog().setOnDismissListener(new DialogInterface.OnDismissListener() {
                @Override
                public void onDismiss(DialogInterface dialog) {
                        if (d.HasDate())
                           {
                             DoStuff();
                           }
                      }

    });
然后,我决定用一个接口来更新它,但它也不起作用

    //DATEDIALOG
     public interface DismissListener{
            void onDialogDismiss(DateDialog d);
        }

        private DismissListener mListener;

        public void setDismissListener(DismissListener listener){
            mListener = listener;
        }


        @Nullable
        @Override

        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.datedialog, container, false);

            localf = android.text.format.DateFormat.getMediumDateFormat(getContext());

             TomorrowB.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    setTomorrow();
                    HasDate = true;
                    dismiss();
                }
            });

            return v;
        }


//FRAGMENT A

DateB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final DateDialog d = new DateDialog();
                d.setDismissListener(new DateDialog.DismissListener() {
                    @Override
                    public void onDialogDismiss(DateDialog d) {
if (d.HasDate())
                               {
                                 DoStuff();
                               }
                          }
我也尝试了OnCancelListener(),但它是一样的。
附言:

这确实有效,直到几天前,我不知道我从支持库迁移到AndroidX库是否有任何关系。

这是因为您迁移到AndroidX。 在AndroidX中注册Disclose侦听器的新方法称为onDismiss(),而不是setOnDismissListener()。您可以参考文档。实际上,androidstudio应该在编译时为您提供使用错误方法的错误信息。可能您已经实现了这两个库。 因此,您的代码(来自第一个示例)应该如下所示:

    d.onDismiss(new DialogInterface() {
        @Override
        public void cancel() {

        }

        @Override
        public void dismiss() {

        }
    });

这是因为您迁移到AndroidX。 在AndroidX中注册Disclose侦听器的新方法称为onDismiss(),而不是setOnDismissListener()。您可以参考文档。实际上,androidstudio应该在编译时为您提供使用错误方法的错误信息。可能您已经实现了这两个库。 因此,您的代码(来自第一个示例)应该如下所示:

    d.onDismiss(new DialogInterface() {
        @Override
        public void cancel() {

        }

        @Override
        public void dismiss() {

        }
    });
根据:

注意:DialogFragment拥有和回调您不能自己设置这些事件。要了解这些事件,请覆盖和

情况一直如此

您应该创建自己的回调接口,并从DateDialog的
onDismiss()
调用该接口,而不是直接调用
setOnDismissListener

class DateDialog {
    interface DismissListener {
        void onDismiss(boolean hasDate)
    }

    private DismissListener listener = null;

    public void setDismissListener(DismissListener listener) {
        this.listener = listener;
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        if (listener != null) {
            listener.onDismiss(HasDate);
        }
    }
}
然后像这样使用它:

 final DateDialog d = new DateDialog();
 d.show(getChildFragmentManager(), "DateDialog");
 getChildFragmentManager().executePendingTransactions();
 d.setDismissListener(new DismissListener() {
     @Override
     public void onDismiss(boolean hasDate) {
         if (hasDate) {
             DoStuff();
         }
     }
 });
根据:

注意:DialogFragment拥有和回调您不能自己设置这些事件。要了解这些事件,请覆盖和

情况一直如此

您应该创建自己的回调接口,并从DateDialog的
onDismiss()
调用该接口,而不是直接调用
setOnDismissListener

class DateDialog {
    interface DismissListener {
        void onDismiss(boolean hasDate)
    }

    private DismissListener listener = null;

    public void setDismissListener(DismissListener listener) {
        this.listener = listener;
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        if (listener != null) {
            listener.onDismiss(HasDate);
        }
    }
}
然后像这样使用它:

 final DateDialog d = new DateDialog();
 d.show(getChildFragmentManager(), "DateDialog");
 getChildFragmentManager().executePendingTransactions();
 d.setDismissListener(new DismissListener() {
     @Override
     public void onDismiss(boolean hasDate) {
         if (hasDate) {
             DoStuff();
         }
     }
 });

如果我添加该代码,对话框不会显示,但是如果我不编写它,它会显示,但是,主要问题仍然存在。
onDismiss
是当对话框被取消时,
DialogFragment
调用自己的回调,而不是如何为取消事件注册侦听器。如果我添加该代码,对话框不会显示,但是,如果我不写,它会写,但是,主要的问题仍然存在。
onDismiss
是当对话框被解除时,
DialogFragment
调用自己的回调,而不是如何为解除事件注册侦听器。