Не удается закрыть пользовательский AlertDialog

#android-studio

#android-studio

Вопрос:

итак, у меня есть приложение с тремя разными кнопками (родительскими кнопками), при нажатии на любую из них отображается диалоговое окно пользовательского оповещения с 9 разными кнопками, но функции этих 9 кнопок в диалоговом окне оповещения различаются в зависимости от того, какая из трех родительских кнопок ее вызвала. При нажатии любой из 9 кнопок я хочу, чтобы приложение выполняло определенную функцию, а затем закрывало alertdialog. Теперь проблема в том, что я могу легко вызвать диалоговое окно оповещения, вызвав созданный мной метод showcustomdialog(); , но я не могу отклонить его, используя alertdialog.dismiss(); внутри OnClickListener родительской кнопки, поскольку метод имеет тип результата void . Я пытался использовать операторы if-else, но это не работает. Как я могу добиться того, что требуется?

Метод:

     private void showCustomDialog() {
    ViewGroup viewGroup = findViewById(android.R.id.content);
    View dialogView = LayoutInflater.from(this).inflate(R.layout.dialog_main2, viewGroup, false);
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setView(dialogView);
    final AlertDialog alertDialog = builder.create();
    alertDialog.show();
      }
  

Я вызываю meathod и использую его следующим образом:

     parentbutton1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        showCustomDialog();
        alertbutton1.getId();
        alertbutton1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                textView1.setText("500");
                function();
             //I want to dismiss the alertdialog here.
            }
        });
        alertbutton2.getId();
        alertbutton2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                textView1.setText("1000");
                function();
             //I want to dismiss the alertdialog here.
            }
        });
  

и так далее.

Комментарии:

1. Вы пытались вызвать dismiss(); ?

2. Это не сработает, потому что, как я уже упоминал, метод showcustomdialog() имеет тип результата void, я хочу вызвать функцию dismiss вне метода showcustomdialog() .

3. откуда вы взяли alertbutton1 ? Является ли это частью диалогового окна?

4. да, это часть диалогового окна. Я мог бы установить onClickListeners для кнопок в showcustomdialog() методе, но, как я уже упоминал, их функция отличается в зависимости от того, какая родительская кнопка вызывает alertdialog, поэтому это не вариант.

5. Но alertButton1 не является частью представления, которое было добавлено в AlertDialog. как вы инициализировали alertButton1?

Ответ №1:

Я нашел решение для вас, используя AlertDialog.

   parentbutton1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                createDialog();
            }

        });
  

Тогда метод ДОЛЖЕН быть частным или общедоступным AlertDialog:

    private AlertDialog createDialog() {

    LayoutInflater inflater = (getActivity()).getLayoutInflater(); // for fragment or getLayoutInflater(); for activity
    View v = inflater.inflate(R.layout.dialog_add_new_list, null);
    Button okButton = v.findViewById(R.id.confirm_button);
    Button cancelButton = v.findViewById(R.id.cancel_button);
    
    final AlertDialog dialog = new AlertDialog.Builder(getActivity()) // for fragment or AlertDialog.Builder ( this ) for activity
        .setView(v)

        .show();
        
    okButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                
        }
    });
    cancelButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View p1) {
                dialog.dismiss();
            }


        });
    
    return dialog;
    
}
  

PS Замените идентификаторы, которые я использовал для создания этого примера, на ваши.