2012-11-06 18 views
5

Come posso ottenere una "top" View della mia applicazione (che contiene Activity e tutti DialogFragment s)? Devo intercettare tutti gli eventi di tocco per gestire il movimento di alcuni View tra DialogFragment e il mio Activity.Come intercettare tutti gli eventi touch?

Ho cercato di catturarli (evento) attraverso la visione arredamento di attività di Window senza fortuna:

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

Override l'Attività # dispatchTouchEvent (..) metodo consente di intercettare tutti gli eventi tocco prima della Vista: s vederli . – Jens

+0

@Jens è vero, ma non intercetta tocchi su 'DialogFragment' (perché appartiene forse ad un'altra finestra) –

+0

Immagino tu abbia provato a mettere la tua finestra TYPE_SYSTEM_ALERT su tutto usando WindowManager # addView (..)? – Jens

risposta

14

è possibile ignorare la di intercettare tutti gli eventi di tocco nella vostra attività, anche se si dispone alcune viste come ScrollView, Button, ecc. che consumeranno l'evento touch.

In combinazione con ViewGroup.requestDisallowInterceptTouchEvent, è possibile disabilitare l'evento di tocco del ViewGroup. Ad esempio, se si desidera disabilitare tutto l'evento in qualche tocco ViewGroup, provate questo:

@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); 
     } 
    } 
} 
Problemi correlati