Android:如何防止任何触摸事件从视图传递到下面的一个?

特别是使用下面的代码,有没有办法修改它,使这个新创build的视图下的活动没有收到任何手势?

View v1 = new View(this); WindowManager.LayoutParams params = new WindowManager.LayoutParams( 1000, 50, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.OPAQUE); params.gravity = Gravity.BOTTOM; WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); wm.addView(v1, params); 

将顶部位置的onTouchEvent方法添加到视图,然后返回true。 True会告诉事件冒泡事件被消耗,因此防止事件冒泡到其他视图。

 protected boolean onTouchEvent (MotionEvent me) { return true; } 

对于v1你会做一个导入:

 import android.view.View.OnTouchListener; 

然后设置onTouchListener:

 v1.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } }); 

来自代码

 View v1 = new View(this); v1.setClickable(true); v1.setFocusable(true); 

要么

从XML

 <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="My button" android:focusable="true" android:clickable="true"/> 

这将防止触摸和点击事件传播到视图下面的视图。
或者,如果您膨胀视图然后到.xml添加android:clickable="true"

你也可以这样做。 您可以将触摸监听器设置为子视图,然后在onTouch()事件中,可以阻止父代的intercept touch event

 View v = findViewById(R.id.sample_view); v.setOnTouchListener(new OnTouchListener() { // Setting on Touch Listener for handling the touch inside ScrollView @Override public boolean onTouch(View v, MotionEvent event) { // Disallow the touch request for parent scroll on touch of child view v.getParent().requestDisallowInterceptTouchEvent(true); return false; } }); 

我对派对有点晚了,但我不认为接受的解决scheme是非常棒的。 这是一个静态方法,它接受任意数量的视图并禁用此事件冒泡。 这对我来说是100%的API 17+(未经testing)

 public static void disableEventBubbling(View... views){ for(View view : views){ if(view != null){ view.setOnTouchListener(new View.OnTouchListener(){ @Override public boolean onTouch(View view, MotionEvent event){ view.getParent().requestDisallowInterceptTouchEvent(true); return false; } }); } } } 

你可以添加一个你想要的任何types的事件,或者你可以摆脱开关,并使默认情况下触摸监听器内的唯一行。