有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

未调用java DialogFragment OnDismissListener

我刚刚做了一个构建,注意到我的代码不起作用,在设置了一些断点之后,我看到,实际上,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 = 安卓.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 = 安卓.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(),但它是一样的
PS:
这确实有效,直到几天前,我不知道我从支持库迁移到AndroidX库是否有什么关系


共 (2) 个答案

  1. # 1 楼答案

    根据^{} documentation

    Note: DialogFragment own the Dialog.setOnCancelListener and Dialog.setOnDismissListener callbacks. You must not set them yourself. To find out about these events, override onCancel(DialogInterface) and onDismiss(DialogInterface).

    情况一直如此

    您应该创建自己的回调接口,并从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();
             }
         }
     });
    
  2. # 2 楼答案

    这是因为你迁移到AndroidX。 在AndroidX中注册Dismise listener的新方法称为onDismiss(),而不是setOnDismissListener()。你可以参考文档here。实际上,Android studio应该在编译时给你错误的方法。可能您已经实现了这两个库。 因此,您的代码(来自第一个示例)应该如下所示:

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