2016-04-14 3 views
2

Ich habe einen Dialog und ich möchte es auf Tastendruck-außerhalb nach einer Zeitverzögerung.Dialog entlassen Verzögerung - Android

Wenn ich dies tun -

dialog.setCanceledOnTouchOutside(false); 

Und einen Hauch Zuhörer auf eine darunterliegende Ansicht hinzufügen,

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; 
     } 
    }); 

offensichtlich wird es nicht funktionieren, da ich es nicht-kündbare gemacht haben.

Aber wenn ich dies tun -

dialog.setCanceledOnTouchOutside(true); 

Ich kann die Verzögerung bei der Entlassung steuern.

Alle Fenstereigenschaften usw. kann ich verwenden, um dies zu kontrollieren? Wie kann ich das Ereignis "extern-dialog-touch" verfolgen?

+0

IDK, warum Sie wollen würde, dass Coz, es könnte ein schlechtes UX sein .. Nun, Sie können transluzente Aktivität anstelle von Dialog verwenden und alle Berührung behandeln. –

Antwort

1

Sie können eine benutzerdefinierte erstellen Dialog zwingende 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); 
     } 
    } 

Dann sollten Sie "manuell" erstellen Sie Ihre Dialog:

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