2014-10-19 10 views
6

Tài liệu nêu rõ rằng PopupWindow sẽ được thông báo về các sự kiện chạm bên ngoài cửa sổ khi setOutsideTouchable(boolean touchable) được đặt thành true. popupwindow được thông báo như thế nào? Tôi không thấy bất kỳ người nghe nào như setOnOutsideTouchListener v.v. để nhận thông tin đó.PopupWindow được thông báo về các sự kiện bên ngoài xúc động như thế nào?

Ví dụ

PopupWindow popup = new PopupWindow(); 
popup.setOutsideTouchable(true); 
//now what..how to receive those touch outside events? 

Cảm ơn.

Trả lời

7

cố gắng sử dụng setTouchInterceptor như snipt mã sau đây

popup.setTouchInterceptor(new OnTouchListener() 
    { 

     public boolean onTouch(View v, MotionEvent event) 
     { 
      if (event.getAction() == MotionEvent.ACTION_OUTSIDE) 
      { 
       popup.dismiss(); 
       return true; 
      } 

      return false; 
     } 
    }); 

cũng đừng quên để thiết lập thew sau cờ:

popup.setOutsideTouchable(true); 
+0

Để thêm vào điều này, các phương thức hiển thị .. (showAtLocation hoặc ShowAsDropDown) nên được gọi là SAU câu trả lời ở trên và không ở giữa. – Thupten

+2

'if (event.getAction() == MotionEvent.ACTION_OUTSIDE) 'luôn luôn không đúng như mọi khi nó là MotionEvent.ACTION_DOWN, và do đó giải pháp này không hoạt động, giải pháp tốt hơn là đặt OnDismissListener sẽ được gọi mỗi khi bạn nhấp vào bên ngoài cửa sổ. Tôi đã thêm câu trả lời này làm câu trả lời –

0

"Cửa sổ bật lên là vùng chứa nổi xuất hiện ở đầu hoạt động hiện tại ".

See: https://developer.android.com/reference/android/widget/PopupWindow.html 

Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm.

+0

Tôi biết cửa sổ bật lên là gì. Câu hỏi của tôi là cụ thể về phương pháp setOutsideTouchable. – Thupten

+0

@Thupten Tôi không thực sự chắc chắn làm thế nào nó được thông báo nhưng thấy điều này. "Kiểm soát xem cửa sổ bật lên có được thông báo về các sự kiện cảm ứng bên ngoài cửa sổ hay không. Điều này chỉ có ý nghĩa đối với cửa sổ bật lên nhưng không thể lấy nét, có nghĩa là chạm bên ngoài cửa sổ sẽ được chuyển đến cửa sổ phía sau. Giá trị mặc định là false Nếu cửa sổ bật lên hiển thị, việc gọi phương thức này sẽ chỉ có hiệu lực vào lần tiếp theo cửa sổ bật lên được hiển thị hoặc thông qua cuộc gọi thủ công đến một trong các phương thức update(). " Hy vọng điều này sẽ giúp ích một chút. – SkullDev

0

PopupWindow thông báo về các sự kiện liên lạc bên ngoài cùng một cách như trên tất cả các các sự kiện liên lạc khác. Khi cờ được đặt bên ngoài các sự kiện được định tuyến đến cửa sổ bật lên và bạn có thể xử lý chúng giống như cách bạn xử lý các lần chạm. Không có phương pháp đặc biệt nào để kiểm tra sự kiện bên ngoài này hoặc đặt người nghe cho các sự kiện thuộc loại đó. Nếu bạn kiểm tra mã nguồn:

1341  @Override 
1342  public boolean dispatchTouchEvent(MotionEvent ev) { 
1343   if (mTouchInterceptor != null && mTouchInterceptor.onTouch(this, ev)) { 
1344    return true; 
1345   } 
1346   return super.dispatchTouchEvent(ev); 
1347  } 
1348 
1349  @Override 
1350  public boolean onTouchEvent(MotionEvent event) { 
1351   final int x = (int) event.getX(); 
1352   final int y = (int) event.getY(); 
1353    
1354   if ((event.getAction() == MotionEvent.ACTION_DOWN) 
1355     && ((x < 0) || (x >= getWidth()) || (y < 0) || (y >= getHeight()))) { 
1356    dismiss(); 
1357    return true; 
1358   } else if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { 
1359    dismiss(); 
1360    return true; 
1361   } else { 
1362    return super.onTouchEvent(event); 
1363   } 
1364  } 

Bây giờ bạn có thể thấy rằng PopupWindow tự kiểm tra xem X/Y của sự kiện có nằm ngoài và loại bỏ chính nó hay không. Vì vậy, bạn có thể thiết lập TouchInterceptor để bắt sự kiện trước hoặc thay vào đó xử lý mặc định. Hoặc bạn có thể ghi đè onTouchEvent để xử lý sự kiện của riêng bạn và gọi siêu nếu nó có ý nghĩa với bạn.

0

补充: Trong trường hợp của tôi, nếu tôi nhấp vào EditText ngoài popupWindow, Nếu setFocusable (true), event.getAction() == 0 (Vì vậy, tôi phải nhấp vào EditText để đầu vào tăng gấp đôi.) Nếu setFocusable (false, event.getAction() == 4 (MotionEvent.ACTION_OUTSIDE). (nhấp vào một thời gian, và tôi có thể đầu vào)

1

Khi bạn chạm vào bên ngoài PopupWindow, OnDismissListener được kích hoạt như chạm vào cửa sổ bên ngoài bác bỏ các cửa sổ bằng cách mặc định, vì vậy bạn có thể đặt OnDismissListener trên popupWindow để nghe chạm bên ngoài cửa sổ.

popup.setOnDismissListener(new PopupWindow.OnDismissListener() { 
    @Override 
    public void onDismiss() { 
     //Do Something here 
    } 
}); 
+0

Đây phải là câu trả lời được chấp nhận – grago

Các vấn đề liên quan