1. 程式人生 > >Activity對話方塊樣式. 點選空白區域關閉視窗

Activity對話方塊樣式. 點選空白區域關閉視窗

  Dialog除了使用Dialog類來實現之外,還可以使用Dialog樣式的Activity來實現,只需要在註冊Activity時指明theme為adnroid:Theme.Dialog就行,這樣的Dialog因為實際上是個Activity而更加豐富靈活。在API11(如果沒記錯的話)之前的dialog樣式Activity是模式的,點選對話方塊外部對話方塊不會消失,而API11之後雖然依然是模式的,但點選對話方塊外部後對話方塊消失,相當於點選了返回鍵。

  如何人為控制點選對話方塊(Activity)外部時視窗是否銷燬呢?在API11之後添加了setFinishOnTouchOutside()方法,只需要在onCreate()方法中呼叫:

this.setFinishOnTouchOutside(false);

 就可以設定點選對話方塊外部是否消失,但API11之前沒有這個方法,也就是說API11之前沒有現成的方法能夠實現點選dialog樣式Activity外部對話方塊消失,所以真正監聽這個點選事件才是根本解決方法。

  Stackoverflow上有人給出了一種非常有效的思路。首先在View建立之前設定兩個Flag,一個設定視窗為非模式的,這樣除視窗外的內容就可以獲得touch事件,然後設定視窗外部touch事件發生時的通知。最後重寫onTouchEvent,監聽視窗外的Touch事件。這樣就可以在監聽方法中自定義視窗外點選事件的響應,是否關閉視窗或者其他操作。

複製程式碼
public class MyActivity extends Activity {

 @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Make us non-modal, so that others can receive touch events.
    getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL);

    
// ...but notify us that it happened. getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH); // Note that flag changes must happen *before* the content view is set. setContentView(R.layout.my_dialog_view); } @Override public boolean onTouchEvent(MotionEvent event) { // If we've received a touch notification that the user has touched // outside the app, finish the activity. if (MotionEvent.ACTION_OUTSIDE == event.getAction()) { finish(); return true; } // Delegate everything else to Activity. return super.onTouchEvent(event); } }
複製程式碼