首页 > 解决方案 > Android:重用 AlertBuilder 实例

问题描述

我在一个方法中创建了一个方法,在使用这个对话框之前我只调用了一次这个方法:

 private void makeAlertDialogBuilder() {
        binding = DataBindingUtil.inflate(LayoutInflater.from(getContext()),
                R.layout.revisited_dialog, null, false);
        alertBuilder = new AlertDialog.Builder(getContext()).setView(binding.getRoot())
                .setView(binding.getRoot());
        binding.btnCancel.setOnClickListener(v -> alertDialog.dismiss());
    }

我在工具栏中有一个菜单,所以我想点击添加菜单项,此对话框打开并显示新消息,当我单击编辑菜单项时显示带有新消息的对话框:

toolbar.setOnMenuItemClickListener(item -> {
    int id = item.getItemId();
    if (id == R.id.add_row) {
        alertDialog = alertBuilder
                .setMessage("Add")
                .setCancelable(false)
                .show();

        exGridAdapter = new RevisitGridAdapter(gridAdapter, baseClass, Action.ADD);
        initRecyclerView(exGridAdapter);
        return true;

    } else if (id == R.id.edit_row) {
        if (selectedItem != null) {
            alertDialog = alertBuilder
                    .setMessage("Edit")
                    .setCancelable(false)
                    .show();
            exGridAdapter = new RevisitGridAdapter(gridAdapter, baseClass, Action.EDIT, selectedItem);
            initRecyclerView(exGridAdapter);
        } 

第一次单击时,会显示对话框,但是当它被关闭并再次单击时,我收到 ANR 错误:

指定的孩子已经有一个父母。您必须首先在孩子的父母上调用 removeView()。

我已经创建了一个对象alertBuilder并且我想使用它?有可能还是我必须重新创建新的 alertBuilder 对象?

标签: androidandroid-alertdialog

解决方案


AlertDialog.Builder alertDialog;  // Your Global Object

    AlertDialog.Builder getAlertDialogObject() {
        if (alertDialog != null) {
            return alertDialog;
        } else {
            alertDialog = new AlertDialog.Builder(LoginIssueScreen.this);
        }
        return alertDialog;
    }

您需要为 AlertDialog 创建一个通用方法:-

    public void showAlerDialogResult(String msg, String title) {

            AlertDialog.Builder alertDialog = getAlertDialogObject();
            alertDialog.setMessage(msg);
            alertDialog.setIcon(R.drawable.ic_check_green);
            alertDialog.setTitle(title);
            alertDialog.setCancelable(false);
            alertDialog.setPositiveButton("OK", (dialogInterface, i) -> {
                // Your code on click on ok

            });
            alertDialog.setNegativeButton("Cancel", (dialogInterface, i) -> {
             // Your code on click on Cancel

        });
            alertDialog.show();

        }

并像下面这样称呼它-:

showAlerDialogResult("Add Button clicked", "Click Event");

                or

showAlerDialogResult("Edit Button clicked", "Click Event");

推荐阅读