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

Min*_*ire 57 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);
Run Code Online (Sandbox Code Playgroud)

Joh*_*tta 98

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

protected boolean onTouchEvent (MotionEvent me) {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

因为v1你会做一个导入:

import android.view.View.OnTouchListener;
Run Code Online (Sandbox Code Playgroud)

然后设置onTouchListener:

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


vov*_*ost 51

从代码

View v1 = new View(this);   
v1.setClickable(true);
v1.setFocusable(true);
Run Code Online (Sandbox Code Playgroud)

要么

来自xml

<View
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="My button"
    android:focusable="true"
    android:clickable="true"/>
Run Code Online (Sandbox Code Playgroud)

这样可以防止触摸和点击事件传播到视图下方的视图.
或者,如果您将视图扩展为.xml添加android:clickable="true"

  • 请注意,这可能会对传递给视图的第一个可聚焦元素的点击的触摸动画产生不利影响。在我的例子中,我有一个 SeekBar 作为可点击视图的子元素,按下它里面的任何地方都会导致 SeekBar 的波纹动画开始。 (3认同)
  • 我认为这是最好的解决方案,因为它可以直接从xml完成 (2认同)

Dhr*_*tel 19

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


小智 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"/>
Run Code Online (Sandbox Code Playgroud)

  • “可点击”是这里的重要部分。但是:即使您的布局位于其他所有内容之上(也可以是“include”)设置为“match_parent”,它也不会覆盖工具栏,这意味着工具栏上的按钮仍然是可单击的。 (2认同)