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

时间:2018-10-10 17:37:53

标签: android android-layout android-fragments onclicklistener android-button

由于布局,我创建了一个对话框,其布局以及取消和提交按钮是完全自定义的。我要处理两个按钮上的点击-特别是在这个问题中,我们考虑取消按钮。

问题

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

实施

说明

我创建了一个对话框片段。在其中,我使用对话框构建器来创建我的对话框(根据官方文档的建议)。我为取消按钮设置了点击处理程序,并取消了其中的对话框。

取消按钮是可单击的(在布局文件中指定)。因此,通常会很好地触发该事件。似乎没有处理。

来源

DialogFragment.java

NB:在下面,未显示输出“ ok”,而显示了按钮参考的输出。这意味着将执行设置点击事件处理程序的函数(并且按钮是从布局中正确获取的),但是即使执行一次点击,点击事件处理程序也不会执行。

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

}

dialog.xml(即:该片段的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 个答案:

答案 0 :(得分:1)

看看代码中的这两行:

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通过再次膨胀相同的布局文件来创建View View中的局部变量 view 可以访问这个新的onCreateDialog(),但是它永远不会添加到任何ViewGroup中,因此实际上不会显示。由于无法单击此Button中包含的View,因此它的OnClickListener将永远不会触发。

因此,您应该像这样设置AlertDialog

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;