2012-11-06 17 views
5

Jak mogę uzyskać "najlepsze" View mojej aplikacji (która zawiera Activity i wszystkie s DialogFragment)? Muszę przechwycić wszystkie zdarzenia dotykowe, aby poradzić sobie z ruchem niektórych View między DialogFragment a moim .Jak przechwycić wszystkie zdarzenia dotyku?

Próbowałem złapać je (zdarzenie) w widoku dekoracyjnym z Aktywny na Window bez powodzenia:

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

Zastępowanie aktywności # dispatchTouchEvent (..) Metoda pozwala przechwytywać wszystkie zdarzenia dotykowe przed Widok: y je zobaczyć . – Jens

+0

@Jens to prawda, ale nie przechwytuje akcentów na 'DialogFragment' (ponieważ może należeć do innego okna) –

+0

Zgaduję, że próbowałeś umieścić swoje własne okno TYPE_SYSTEM_ALERT na szczycie wszystkiego przy użyciu WindowManager # addView (..)? – Jens

Odpowiedz

14

Można zastąpić przechwytywać wszystkie dotykowe wydarzenia w swojej działalności, nawet jeśli masz niektóre widoki, takie jak ScrollView, Button, itp., które pochłoną zdarzenie dotykowe.

Łącząc z ViewGroup.requestDisallowInterceptTouchEvent, można wyłączyć wydarzenie dotykowe grupy ViewGroup. Na przykład, jeśli chcesz wyłączyć wszystkie dotykowego wydarzenie w pewnym ViewGroup, spróbuj tego:

@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); 
     } 
    } 
} 
Powiązane problemy