Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:如何防止任何触摸事件从一个视图传递到它下面的视图?_Android - Fatal编程技术网

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

Android:如何防止任何触摸事件从一个视图传递到它下面的视图?,android,Android,特别是使用下面的代码,是否有办法修改它,使新创建的视图下的活动不会收到任何手势 View v1 = new View(this); WindowManager.LayoutParams params = new WindowManager.LayoutParams( 1000, 50, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | Win

特别是使用下面的代码,是否有办法修改它,使新创建的视图下的活动不会收到任何手势

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
方法添加到具有top position的视图中,然后返回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;
    }
});
源代码 或

从xml

这将防止触摸和单击事件传播到视图下方的视图。

或者,如果您将视图膨胀到.xml,则添加到android:clickable=“true”

,您也可以这样做。您可以将touch listener设置为子视图,然后在
onTouch()
事件中,您可以阻止父视图的
拦截touch事件

i、 e


我参加聚会有点晚了,但我认为公认的解决办法不是很好。下面是一个静态方法,它接受任意数量的视图并禁用此事件冒泡。对于API 17+(未经测试的较低版本),这对我来说100%的时间都有效


您可以为您想要的任何类型的事件添加一个case,或者您可以取消开关,将默认case设置为touch listener中的唯一行。

您只需调用

arg0.getParent().requestDisallowInterceptTouchEvent(true);
在onTouch函数的开头。像thsi-

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

        return false; 

     }

您可以添加如下所示的视图,但请确保它是您添加到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"/>

只需在俯视图背景中添加一个单击代理,即可停止下方的视图接收触摸

linear_layout_background.Click += delegate
            {
                // Ensures views underneath does not receive touch events
            };

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

正如你在这里看到的:

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

    })

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

很好的解决方案,非常适合这个问题。但可能需要注意的是,它并不能阻止底层视图接收来自物理键盘的输入(这意味着,如果用户像我一样使用带有物理光标键的手机,他们仍然可以摆弄伪禁用的组件)。注意,这可能会对将单击的触摸动画传递到视图的第一个可聚焦元素产生不利影响。在我的例子中,我有一个SeekBar作为clickable view的孩子,按下它里面的任何地方都会启动SeekBar的ripple动画。我认为这是最好的解决方案,因为它可以直接从xmlthis works中完成。无需在Kotlin/JavaListener中创建onTouchListener谢谢。。。为我工作:-)你保存了我的第10天+这有助于我将recyclerview嵌套在另一个具有相同滚动方向的recyclerview中,快速滚动器无法工作。在fast scroller中调用prent.requestDisallowerWinterCeptTouchEvent(true),该事件解决了问题。
clickable
是此处的重要部分。但是:即使您的布局位于所有其他布局之上(也可以是
include
d)设置为
match\u parent
,它也不会覆盖工具栏,这意味着工具栏上的按钮仍然可以单击。这是一个可行的解决方案,主要是设置此拦截器的最高标高。
    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        arg0.getParent().requestDisallowInterceptTouchEvent(true);
        switch(arg1.getActio){
        }

        return false; 

     }
<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"/>
linear_layout_background.Click += delegate
            {
                // Ensures views underneath does not receive touch events
            };
  someView.setOnTouchListener(object: View.OnTouchListener {
        override fun onTouch(v: View?, event: MotionEvent?): Boolean{
            return true
        }

    })