Как я могу остановить одно и то же диалоговое окно с предупреждениями, отображаемое каждый раз из обработчика? - PullRequest
0 голосов
/ 13 июня 2018

У меня есть AlertDialog для метода, и метод используется внутри Handler.Когда Handler работает каждый раз, когда AlertDialog также загружается снова и снова, я хочу показать диалоговое окно один раз, если диалоговое окно все еще показывает, я не хочу загружать его снова.Для этого у меня есть код ниже, но не работает.

     Handler handler = new Handler();
      Runnable runnable = new Runnable() {
        @Override
          public void run() {
            handler.postDelayed(this, 1000);
            checkCountry();
        }

    };
    handler.postDelayed(runnable, 1000);




public void checkCountry() {

            alertDialogueBuilder = new     AlertDialog.Builder(MainActivity.this);
            alertDialogueBuilder.setTitle("VPN Detected!");
                      alertDialogueBuilder.setMessage("Please Turn Of VPN To Continue!");
   alertDialogueBuilder.setIcon(R.drawable.errorstop);
      alertDialogueBuilder.setCancelable(false);
            alertDialogueBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                }
            });
            AlertDialog alertDialog =     alertDialogueBuilder.create();

            if(alertDialog.isShowing()){
             //Do Something
            }else{
             alertDialog.show();
            }
   }

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Чтобы показать только одноразовое диалоговое окно, вызовите только этот метод checkCountry (), из которого вы хотите показать это диалоговое окно.И, пожалуйста, удалите код обработчика.Нет необходимости использовать обработчик здесь.Используйте только метод checkCountry () для отображения диалога.

0 голосов
/ 13 июня 2018

Самым старым трюком в книге является просто создание логического поля isAlertDialogShown с ложной инициализацией, после создания в true и в onClick снова установите его в false (если вы хотите, чтобы оно снова отображалось при запуске обработчика).

private boolean isShown = false;    
public void checkCountry() { 
            if (isShown){
             //do something
             return;
             }
            isShown = true;
            alertDialogueBuilder = new     AlertDialog.Builder(MainActivity.this);
            alertDialogueBuilder.setTitle("VPN Detected!"); 
                      alertDialogueBuilder.setMessage("Please Turn Of VPN To Continue!"); 
   alertDialogueBuilder.setIcon(R.drawable.errorstop);
      alertDialogueBuilder.setCancelable(false); 
            alertDialogueBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                @Override 
                public void onClick(DialogInterface dialog, int which) {
                    isShown = false;
                    finish();
                } 
            }); 
            AlertDialog alertDialog =     alertDialogueBuilder.create();

             alertDialog.show();
   }

, если вы хотите попробовать и использовать alertDialog isShowing, вам нужно использовать созданный вами, а не новый, поэтому снова сохраните его как поле, но у вас все равно может быть реброслучай, если таймер обработчика работает слишком быстро, и это alertDialog.show () не является немедленной операцией:

AlertDialog alertDialog;
public void checkCountry() { 
            if ( alertDialog != null && alertDialog.isShowing){
                //do something
                return;                     
            }
            alertDialogueBuilder = new     AlertDialog.Builder(MainActivity.this);
            alertDialogueBuilder.setTitle("VPN Detected!"); 
                      alertDialogueBuilder.setMessage("Please Turn Of VPN To Continue!"); 
   alertDialogueBuilder.setIcon(R.drawable.errorstop);
      alertDialogueBuilder.setCancelable(false); 
            alertDialogueBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                @Override 
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                } 
            }); 
            alertDialog =     alertDialogueBuilder.create();

            alertDialog.show();
   } 
0 голосов
/ 13 июня 2018

Создайте свой Dialog только один раз и не каждый раз:

private AlertDialog alertDialog;
// ...
initDialog();
Handler handler = new Handler();
  Runnable runnable = new Runnable() {
    @Override
      public void run() {
        handler.postDelayed(this, 1000);
        checkCountry();
    }

};
handler.postDelayed(runnable, 1000);

//...

public void initDialog() {
     alertDialogueBuilder = new     AlertDialog.Builder(MainActivity.this);
     alertDialogueBuilder.setTitle("VPN Detected!");
     alertDialogueBuilder.setMessage("Please Turn Of VPN To Continue!");
     alertDialogueBuilder.setIcon(R.drawable.errorstop);
     alertDialogueBuilder.setCancelable(false);
     alertDialogueBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        });
        alertDialog =     alertDialogueBuilder.create();
}

public void checkCountry() {
     if(alertDialog.isShowing()){
     //Do Something
     }else{
         alertDialog.show();
     }
}
...