2012-11-06 25 views
5

Làm cách nào để có được một "top" View của đơn đăng ký của tôi (có chứa Activity và tất cả DialogFragment s)? Tôi cần chặn tất cả các sự kiện chạm để xử lý chuyển động của một số View giữa DialogFragmentActivity của tôi.Làm cách nào để chặn tất cả các sự kiện liên lạc?

Tôi đã cố gắng để bắt họ (sự kiện) thông qua việc xem thiết kế nội thất của Hoạt động của Window không có may mắn:

getWindow().getDecorView().setOnTouchListener(...); 
+3

Phương pháp ghi đè hoạt động trước khi xem: xem chúng . – Jens

+0

@ Jens nó là sự thật, nhưng nó không ngăn chặn chạm vào 'DialogFragment' (vì nó thuộc về một cửa sổ khác có thể) –

+0

Tôi đoán bạn đã thử đặt cửa sổ TYPE_SYSTEM_ALERT của riêng bạn trên tất cả mọi thứ bằng WindowManager # addView (..)? – Jens

Trả lời

14

Bạn có thể ghi đè lên để đánh chặn tất cả các sự kiện liên lạc trong hoạt động của bạn, thậm chí nếu bạn có một số Chế độ xem như ScrollView, Nút, v.v. sẽ tiêu thụ sự kiện chạm.

Kết hợp với ViewGroup.requestDisallowInterceptTouchEvent, bạn có thể vô hiệu hóa sự kiện chạm của ViewGroup. Ví dụ: nếu bạn muốn tắt tất cả sự kiện chạm trong một số Nhóm xem, hãy thử điều này:

@Override 
public boolean dispatchTouchEvent(MotionEvent event) { 
    requestDisallowInterceptTouchEvent(
      (ViewGroup) findViewById(R.id.topLevelRelativeLayout), 
      true 
    ); 
    return super.dispatchTouchEvent(event); 
} 

private void requestDisallowInterceptTouchEvent(ViewGroup v, boolean disallowIntercept) { 
    v.requestDisallowInterceptTouchEvent(disallowIntercept); 
    int childCount = v.getChildCount(); 
    for (int i = 0; i < childCount; i++) { 
     View child = v.getChildAt(i); 
     if (child instanceof ViewGroup) { 
      requestDisallowInterceptTouchEvent((ViewGroup) child, disallowIntercept); 
     } 
    } 
} 
Các vấn đề liên quan