Android: повторно использовать экземпляр AlertBuilder - PullRequest
1 голос
/ 08 июля 2019

Я создал в методе, и я вызываю этот метод только один раз, прежде чем использовать это диалоговое окно:

 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?

Ответы [ 4 ]

0 голосов
/ 09 июля 2019

Я наконец-то решил свою проблему, удалив view из parent и снова подключив его к этому методу:

public void showAlerDialogResult(String title) {

    ViewGroup parent = (ViewGroup) binding.getRoot().getParent();
    if (parent != null) {
        parent.removeView(binding.getRoot());
    }
    try {
        makeAlertDialogBuilder();
    } catch (InflateException e) {
        Logger.log(e.getMessage());
    }
    AlertDialog.Builder alertBuilder = new AlertDialog.Builder(getContext())
            .setView(binding.getRoot());
    alertDialog = alertBuilder
            .setTitle(title)
            .setCancelable(false)
            .show();
}

Я упомянул makeAlertDialogBuilder(); метод в моем вопросе. Я надеюсь, что это может быть полезно. Спасибо, ребята, чтобы помочь мне

Танки до ChandraShekhar Kaushik

0 голосов
/ 08 июля 2019

Вы можете использовать что-то подобное в отдельном классе, например, я использовал AlertUtils.java:

 public class AlertUtils
{
   public static void showOKDialog(Context context, String title, String message)
    {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setTitle(title);
    builder.setMessage(message);
    builder.setPositiveButton(android.R.string.ok, null);
    builder.show();
    }
}

В этом методе контекст, через который вы проходите, может быть вашей деятельностью, например: MyActivity.this или getContext () фрагмента ()

AlertUtils.showOKDialog (MyActivity.this, «заголовок диалога», «сообщение для отображения в диалоге»);

0 голосов
/ 08 июля 2019

Эта проблема возникает из-за повторного открытия того же диалога без закрытия предыдущего.

Вам необходимо убедиться, что первый диалог открыт, а затем закройте его. как,

toolbar.setOnMenuItemClickListener(item -> {
    int id = item.getItemId();
    if (id == R.id.add_row) {
        if (alertDialog != null && alertDialog.isShowing()) {
            alertDialog.dismiss();
        }
        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) {
            if (alertDialog != null && alertDialog.isShowing()) {
                alertDialog.dismiss();
            }
            alertDialog = alertBuilder
                    .setMessage("Edit")
                    .setCancelable(false)
                    .show();
            exGridAdapter = new RevisitGridAdapter(gridAdapter, baseClass, Action.EDIT, selectedItem);
            initRecyclerView(exGridAdapter);
        } 
0 голосов
/ 08 июля 2019
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");
...