2016-04-14 4 views
2

У меня есть диалог, и я хочу, чтобы он был разобщен на касании снаружи после задержки.Задержка отклонения Dialog - Android

Если бы я это сделать -

dialog.setCanceledOnTouchOutside(false); 

И добавить сенсорную слушателя к основному мнению,

listview.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
       (new Handler()).postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         dialog.dismiss(); 
        } 
       }, 500); 
      } 
      return false; 
     } 
    }); 

, очевидно, он не будет работать, так как я сделал это не по-отменяемый.

Но если я это сделать -

dialog.setCanceledOnTouchOutside(true); 

Я не могу контролировать задержку в освобождении.

Любые свойства окна и т. Д. Я могу использовать для управления этим? Как я могу отслеживать событие внешнего диалога?

+0

ИДК, почему вы хотите, чтобы сог это могло бы быть плохой UX .. хорошо вы можете использовать полупрозрачную активность вместо диалога и обрабатывать все касание. –

ответ

1

Вы можете создать собственный Dialog переопределяем onTouchEvent

private class MyDialog extends Dialog{ 

     // constructors 

     @Override 
     public boolean onTouchEvent(MotionEvent event) { 
      Rect dialogRect = new Rect(); 
      getWindow().getDecorView().getHitRect(dialogRect); 

      if (!dialogRect.contains((int) event.getX(), (int) event.getY())) { 
       try { 
        Thread.sleep(500); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       this.cancel(); 
      } 

      return super.onTouchEvent(event); 
     } 
    } 

Затем вы должны «вручную» создать свой Dialog:

MyDialog myDialog = new MyDialog(this); 
myDialog.setTitle("Dialog Title"); 
myDialog.setContentView(R.layout.dialog_layout); 
myDialog.show();