具体使用下面的代码,有没有办法修改它,以便这个新创建的视图下的活动不会收到任何手势?
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);
答案 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
<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表示顶视图正在处理触摸,而无需将触摸事件移交给其他相关视图。