2012-11-06 44 views
5

Uygulamamın bir "top" View'unu nasıl alabilirim (Activity ve DialogFragment s içeriyor)? DialogFragment ve Activity arasındaki View hareketinin üstesinden gelmek için tüm dokunma olaylarını engellemem gerekiyor. Aşağıdaki durumlarda dahi,Tüm dokunma olayları nasıl engellenir?

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

Etkinlik # dispatchTouchEvent geçersiz kılma (..) yöntemi Görünüm önce tüm dokunmatik olayları yolunu kesmek için izin verir: s onları görünce . – Jens

+0

@Jens bu doğru, ancak 'DialogFragment' (bu başka bir pencereye ait olduğu için belki de) dokunmalarını engellememektedir. –

+0

Sanırım WindowManager # addView (..) kullanarak herşeyin üstüne kendi TYPE_SYSTEM_ALERT penceresini yerleştirmeyi denediniz mi? – Jens

cevap

14

Sen aktivitesinde tüm dokunmatik olayları önünü geçersiz kılabilirsiniz:

hiçbir şans ile Etkinlik en Window dekor görüntüsü yoluyla (event) yakalamak için çalıştık Dokunma olayını tüketecek ScrollView, Button, vb. Bazı Görünümler.

ViewGroup.requestDisallowInterceptTouchEvent ile birlikte, ViewGroup'un dokunma olayını devre dışı bırakabilirsiniz. Bazı ViewGroup tüm dokunmatik olay devre dışı bırakmak istiyorsanız Örneğin, bu deneyin:

@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); 
     } 
    } 
} 
İlgili konular