2012-11-06 156 views
5

如何獲得我的應用程序的「頂部」View(其中包含Activity和所有DialogFragment)?我需要攔截所有觸摸事件來處理在DialogFragment和我的Activity之間的一些View的運動。如何攔截所有觸摸事件?

我試圖通過活動的Window的,沒有運氣的裝修風格以趕上他們(事件):

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

重寫活動#dispatchTouchEvent(..)方法可以讓你之前攔截所有觸摸事件查看:■遁逃。 – Jens

+0

@Jens它是真的,但它不攔截'DialogFragment'上的觸摸(因爲它可能屬於另一個窗口) –

+0

我想你已經嘗試把你自己的TYPE_SYSTEM_ALERT窗口放在使用WindowManager#addView(..)的所有東西上面? – Jens

回答

14

您可以覆蓋攔截所有觸摸事件,在您的活動,即使你有一些像ScrollView,Button等的視圖會消耗觸摸事件。

結合ViewGroup.requestDisallowInterceptTouchEvent,您可以禁用ViewGroup的觸摸事件。例如,如果要禁用一些ViewGroup中所有的觸摸事件,試試這個:

@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); 
     } 
    } 
} 
相關問題