代码之家  ›  专栏  ›  技术社区  ›  JarsOfJam-Scheduler

片段的AlertDialog的click事件中的自定义取消按钮未处理

  •  1
  • JarsOfJam-Scheduler  · 技术社区  · 6 年前

    问题

    单击“取消”按钮时,不会执行click事件处理程序。

    实施

    可以单击“取消”按钮(在布局文件中指定)。因此,事件通常会被很好地触发。只是好像没办法处理。

    来源

    注意:在下面,没有显示输出“ok”,而显示按钮引用的输出是。这意味着设置click事件处理程序的函数将被执行(并且按钮是从布局中正确获得的),但是click事件处理程序甚至在执行click时都不会执行。

        public class DialogFragment extends DialogFragment {
    
            @NonNull
            @Override
            public Dialog onCreateDialog(Bundle savedInstanceState) {
                // Use the Builder class for convenient dialog construction
                AlertDialog.Builder builder = new AlertDialog.Builder(Objects.requireNonNull(getActivity()));
                builder.setView(R.layout.dialog);
                View view = LayoutInflater.from(this.getContext()).inflate(R.layout.dialog, null);
                Dialog dialog = builder.create();
                setCancelButtonListener((Button) Objects.requireNonNull(view.findViewById(R.id.button_cancel)), dialog);
                return dialog;
            }
        private void setCancelButtonListener(Button button, final Dialog dialog) {
            System.out.println(button);
            button.setOnClickListener( new Button.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    System.out.println("ok");
                    dialog.cancel();
                }
            });
        }
    
    }
    

    即。: 片段的XML布局中的“取消”按钮)

        <Button
            android:clickable="true"
    
            android:id="@+id/button_cancel"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:layout_marginEnd="10dp"
            android:background="@drawable/background_button"
            android:text="@string/cancel"
            android:textColor="@color/colorRoyalRedLight"
            app:layout_constraintEnd_toStartOf="@+id/button3"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/text_4" />
    

    为什么不处理按钮单击事件?如何让它工作?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Bö macht Blau    6 年前

    请看一下代码中的这两行:

    builder.setView(R.layout.dialog);
    View view = LayoutInflater.from(this.getContext()).inflate(R.layout.dialog, null);
    

    在这里,您将布局的资源id提供给 AlertDialog.Builder AlertDialog 的“可定制”区域(您可以通过首先将 View 然后打电话来 AlertDialog.Builder.setView(View) )

    LayoutInflater 创建 通过膨胀 再次使用相同的布局文件 . 这个新的 可由局部变量访问 看法 在里面 onCreateDialog() 但它从未添加到任何 ViewGroup 所以它永远不会被展示出来。因为 Button 查看 OnClickListener 永远不会开火。

    对话框 这样地:

    AlertDialog.Builder builder = new AlertDialog.Builder(Objects.requireNonNull(getActivity()));
    View view = LayoutInflater.from(this.getContext()).inflate(R.layout.dialog, null);
    builder.setView(view);
    Dialog dialog = builder.create();
    setCancelButtonListener((Button) Objects.requireNonNull(view.findViewById(R.id.button_cancel)), dialog);
    return dialog;