自定义对话框不适用于 'setOnClickListener' Android studio

Custom dialog not working with 'setOnClickListener' Android studio

我遇到了一些奇怪的情况 - 我制作了一个自定义对话框,当单击 activity 中的按钮时该对话框会打开。自定义对话框包含一个关闭按钮,单击该按钮可关闭对话框,returns 用户可访问 activity。当我按原样 运行 代码(如下所示)时,它没有启动自定义对话框,而是转到主 activity (我认为要么重新打开应用程序,要么以某种方式为主创建一个假想的意图activity)。但是,当我 remove/comment 关闭按钮的代码 - 突出显示为 // === 此代码时,一切正常(自定义对话框打开)但关闭按钮不起作用。我不确定我错过了什么。

    // Global variable
    Button openDialog;

    // ======
    openDialog = (Button) findViewById(R.id.opendialog);
    openDialog.setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {

            final Dialog cusomDialog = new Dialog(sellActivity.this);
            cusomDialog.setContentView(R.layout.customdialog);


            // === This code
            final Button close = (Button) findViewById(R.id.close);
            close.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        cusomDialog.dismiss();

                    }
                });
            // === This code

            cusomDialog.show();


        }
    });

有人能解释一下吗,我真的很困惑。

首先,您应该通过 cusomDialog View Object 。

其次,对话框创建和调用方法错误。

   final Button close = (Button)cusomDialog.findViewById(R.id.close);
        close.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    cusomDialog.dismiss();

                }
            });

同样的问题

openDialog = (Button)cusomDialog.findViewById(R.id.opendialog); //Rectified

您应该阅读 Custom Dialog 了解更多信息。

Dialog 中初始化 Dialog 的视图:

替换为:

final Button close = (Button) findViewById(R.id.close);

有了这个:

final Button close = (Button) cusomDialog.findViewById(R.id.close);

我认为您应该扩充布局并获取视图并在自定义对话框中设置视图。

final Dialog cusomDialog = new Dialog(sellActivity.this);
View view = LayoutInflater.fromContext(sellActivity.this).inflate(R.layout.customdialog,false);
cusomDialog.setContentView(view);
Button close = (Button) view.findViewById(R.id.close);

祝你好运!!

  1. 如果你使用DataBinding在XML中写一个回调:

    android:onClick="@{_ -> viewModel.onClickAction()}"
    
  2. 如果您使用 ViewBinding,请确保调用 onCreateViewonViewCreated。参见 Android DialogFragment onViewCreated not called

    private lateinit var binding: YourDialogBinding
    
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        binding = YourDialogBinding.inflate(layoutInflater)
        // Create usual or custom dialog
        val builder = AlertDialog.Builder(requireContext()).setView(binding.root)
        return builder.create()
    }
    
    // Need to return the view here or onViewCreated won't be called by DialogFragment
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        super.onCreateView(inflater, container, savedInstanceState)
        return binding.root
    }
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        with(binding) {
            ...