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

时间:2011-12-08 15:30:07

标签: android

具体使用下面的代码,有没有办法修改它,以便这个新创建的视图下的活动不会收到任何手势?

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);

8 个答案:

答案 0 :(得分:90)

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;
    }
});

答案 1 :(得分:47)

来自代码

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

OR

来自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"

答案 2 :(得分:17)

你也可以这样做。您可以将触摸侦听器设置为子视图,然后在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;
    }
});

答案 3 :(得分:5)

您添加如下视图,但请确保它是您添加到xml的最后一个视图。 xml中的最后一项是放在其下所有其他视图之上的项目。

<View
        android:id="@+id/blocking_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#AA666666"
        android:clickable="true"
        android:focusable="true"
        android:visibility="visible"/>

答案 4 :(得分:2)

您需要做的只是致电

arg0.getParent().requestDisallowInterceptTouchEvent(true);

在onTouch函数的开头。喜欢这个 -

    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        arg0.getParent().requestDisallowInterceptTouchEvent(true);
        switch(arg1.getActio){
        }

        return false; 

     }

答案 5 :(得分:1)

我参加派对有点晚了,但我认为接受的解决方案非常好。这是一个静态方法,它接受任意数量的视图并禁用此事件冒泡。对于API 17+(未经测试的较低)

,这对我有100%的时间
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;
                }
            });
        }
    }
}

您可以为您想要的任何类型的事件添加案例,或者您可以摆脱开关并使默认案例成为触摸侦听器中的唯一行。

答案 6 :(得分:0)

只需在顶部视图背景中添加一个点击委托,这将停止在接收到触摸下方的视图

:

答案 7 :(得分:0)

我认为最好的方法是添加一个触摸事件并设置返回值 True

如您所见:

  someView.setOnTouchListener(object: View.OnTouchListener {
        override fun onTouch(v: View?, event: MotionEvent?): Boolean{
            return true
        }

    })

返回True表示顶视图正在处理触摸,而无需将触摸事件移交给其他相关视图。

相关问题