Закрытие пользовательского диалогового окна оповещения при нажатии кнопки

#android #android-alertdialog

#Android #android-alertdialog

Вопрос:

У меня возникли проблемы с закрытием моего диалогового окна оповещения. Я использую layout inflator для создания диалогового окна, поэтому я не уверен, как я буду закрывать это после того, как закончу с этим. Код приведен ниже:

 AlertDialog.Builder dialog = new AlertDialog.Builder(AddData.this);
DialogInterface dia = new DialogInterface();

//Create a custom layout for the dialog box
LayoutInflater inflater = (LayoutInflater)AddData.this.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.add_rep_1_set, parent, false);

TextView title = (TextView)layout.findViewById(R.id.rep_1_title);
Button add_item = (Button)layout.findViewById(R.id.add_button);

add_item.setOnClickListener(new OnClickListener()
{
        @Override
        public void onClick(View v)
        {
        //Need this to close the alert dialog box
        }
});

title.setText(workout_items[position]);
dialog.setView(layout);
dialog.show();
  

Я не могу вызвать finish, потому что это закрывает listview, из которого запускается диалоговое окно alert, и вызовы dialog.dismiss для меня недоступны.

Как ты думаешь, что я должен сделать, чтобы это исправить?

Ответ №1:

 AlertDialog.Builder dialog = new AlertDialog.Builder(AddData.this);
DialogInterface dia = new DialogInterface();

//Create a custom layout for the dialog box
LayoutInflater inflater = (LayoutInflater)AddData.this.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.add_rep_1_set, parent, false);

TextView title = (TextView)layout.findViewById(R.id.rep_1_title);
Button add_item = (Button)layout.findViewById(R.id.add_button);

title.setText(workout_items[position]);
dialog.setView(layout);

AlertDialog alertDialog = dialog.create();

add_item.setOnClickListener(new OnClickListener()
{
    @Override
    public void onClick(View v)
    {
        alertDialog.dismiss();
    }
});


alertDialog.show();
  

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

1. Доступ к переменной AlertDialog осуществляется из внутреннего класса. Должно быть объявлено окончательным.

2. Для чего это DialogInterface dia ?

Ответ №2:

Попробуйте это:

     AlertDialog.Builder builder = new AlertDialog.Builder(this);

    LayoutInflater inflater = getLayoutInflater();
    View dialogView = inflater.inflate(R.layout.brush_opts_dialog,null);

    builder.setView(dialogView);


    closeBtn = (Button)dialogView.findViewById(R.id.close_btn);


   final AlertDialog dialog = builder.create();

    closeBtn .setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dialog.dismiss();
        }
    });

    dialog.show();
  

Вы должны использовать AlertDialog.Конструктор для «сборки» самого диалогового окна оповещения. Затем вызовите метод create() в AlertDialog.Объект Builder. Этот метод возвращает объект AlertDialog, который позволяет вызвать dismiss().

Вам не нужно создавать его несколько раз или использовать какие-либо объекты DialogInterface. У меня это работает. Дайте мне знать, как это происходит у вас.

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

1. Ваше объяснение для вызова create () было тем, что я искал.

Ответ №3:

сделайте это следующим образом,

 add_item.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                        dialog.dismiss();
                }
            });
  

Ответ №4:

я изменил ваш код, пожалуйста, проверьте..

    AlertDialog.Builder dialog = new AlertDialog.Builder(AddData.this);
    DialogInterface dia = new DialogInterface();

    //Create a custom layout for the dialog box
    LayoutInflater inflater = (LayoutInflater)AddData.this.getSystemService(LAYOUT_INFLATER_SERVICE);
    View layout = inflater.inflate(R.layout.add_rep_1_set, parent, false);

    TextView title = (TextView)layout.findViewById(R.id.rep_1_title);
    Button add_item = (Button)layout.findViewById(R.id.add_button);



    final AlertDialog Dial = alertDialog.create();
    title.setText(workout_items[position]);
    Dial.setView(layout);

    AlertDialog alertDialog = dialog.create();

    add_item.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            Dial.dismiss();
        }
    });


    Dial.show();
  

Только что добавлено

окончательный набор AlertDialog = AlertDialog.create(); и измените dialog.setView(layout); на Dialog.setView(layout);

теперь просто вызовите Dial.dismiss(); в onclick listener.. у меня все работает нормально.

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

1. @Abdus.. ПОЧЕМУ ВЫ вызываете create(); два раза?

Ответ №5:

используйте этот код в своем классе:

 Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.custom);
((Button) dialog.findViewById(R.id.button))
   .setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        dialog.dismiss();
    }
});
dialog.show();
  

и создать custom.xml затем вставьте в него этот код:

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button
        android:id="@ id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=" Ok "/>
</RelativeLayout>
  

источник: https://www.mkyong.com/android/android-custom-dialog-example /

и если вам не нравится приведенный выше код, смотрите ссылку ниже:http://thedeveloperworldisyours.com/android/prevent-alertdialog-closing-button-clicked /

Ответ №6:

Попробуйте dialog.cancel(); в вашем прослушивателе onclick. Это должно сработать.

Ответ №7:

Вам необходимо реализовать DialogInterface.OnClickListener вместо просмотра.OnClickListener. затем будет доступен dialog.dismiss().

 new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which){
       dialog.dismiss();
}
}
  

Ответ №8:

Вы получаете ошибку, попробуйте этот код

    dialog.setView(layout);

   final AlertDialog alertDialog = dialog.create();

   add_item.setOnClickListener(new OnClickListener(){
    @Override
     public void onClick(View v)
        {
          if (alertDialog != null amp;amp; alertDialog.isShowing()) {
              alertDialog.dismiss();
        }
      }
    });
   alertDialog.show();  

Ответ №9:

      final viewProgressDialogue viewProgressDialogue = new viewProgressDialogue(DebugActivity.this);
        viewProgressDialogue.show();
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Log.d("response","im calling");
                viewProgressDialogue.dismiss();
            }
        }, 5000);
  
 > Make it one Instance so that it will work
It Will in the Fragment too.

for Fragment Use
  
     final viewProgressDialogue viewProgressDialogue = new viewProgressDialogue(getActivity());
        viewProgressDialogue.show();
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Log.d("response", "im calling");
                viewProgressDialogue.dismiss();
            }
        }, 5000);
  
 > viewProgressDialogue Class
  
 public class viewProgressDialogue extends Dialog {
    public viewProgressDialogue(@NonNull Context context) {
        super(context);

        WindowManager.LayoutParams wlmp = getWindow().getAttributes();
        getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        wlmp.gravity = Gravity.CENTER_HORIZONTAL;
        getWindow().setAttributes(wlmp);
        setTitle(null);
        setCancelable(false);
        setOnCancelListener(null);

        View view = LayoutInflater.from(context).inflate(
                R.layout.custom_progress, null);
        setContentView(view);


    }
}
  

Ответ №10:

В приведенных выше ответах есть небольшое изменение, которое просто проверяет, что если вы написали AlertDialog AlertDialog = builder.create(); перед методом builder.setView(…);, то просто напишите его после builder.setView(…);

Ответ №11:

Попробуйте это:

 btn_go_anyway.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v)
    {
        getDialog().dismiss();
    }
});