2012-11-06 13 views
5

Wie bekomme ich eine "top" View meiner Anwendung (die Activity und alle DialogFragment s enthält)? Ich muss alle Berührungsereignisse abfangen, um die Bewegung einiger View zwischen DialogFragment und meiner Activity zu behandeln.Wie alle Berührungsereignisse abgefangen werden?

Ich habe versucht, sie (Ereignis) durch die Einrichtung Blick auf Aktivität des Window ohne Glück zu fangen:

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

die Aktivität # dispatchTouchEvent Aufschalten (..) Methode ermöglicht es Ihnen, alle Touch-Ereignisse vor der Ansicht abfangen: s sehen, wie sie . – Jens

+0

@Jens es ist wahr, aber es berührt keine Berührungen auf 'DialogFragment' (weil es vielleicht zu einem anderen Fenster gehört) –

+0

Ich vermute, Sie haben versucht, Ihr eigenes TYPE_SYSTEM_ALERT Fenster über alles mit WindowManager # addView (..) zu setzen? – Jens

Antwort

14

Sie die außer Kraft setzen können alle Touch-Ereignisse in Ihrer Tätigkeit abzufangen, auch wenn Sie einige Ansichten wie ScrollView, Button usw., die das Berührungsereignis verbrauchen.

Kombinieren mit ViewGroup.requestDisallowInterceptTouchEvent, können Sie das Touch-Ereignis der ViewGroup deaktivieren. Zum Beispiel, wenn Sie alle Berührungsereignis in irgendeiner Viewgroup deaktivieren möchten, versuchen Sie dies:

@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); 
     } 
    } 
} 
Verwandte Themen