android点击事件禁用,android-禁用所有视图的触摸事件

android-禁用所有视图的触摸事件

禁用所有视图的触摸事件的最佳方法是什么?

非常感谢,

格拉齐

Gratzi asked 2020-07-27T19:09:52Z

13个解决方案

55 votes

这是用于禁用某个视图组的所有子视图的功能:

/**

* Enables/Disables all child views in a view group.

*

* @param viewGroup the view group

* @param enabled true to enable, false to disable

* the views.

*/

public static void enableDisableViewGroup(ViewGroup viewGroup, boolean enabled) {

int childCount = viewGroup.getChildCount();

for (int i = 0; i < childCount; i++) {

View view = viewGroup.getChildAt(i);

view.setEnabled(enabled);

if (view instanceof ViewGroup) {

enableDisableViewGroup((ViewGroup) view, enabled);

}

}

}

peceps answered 2020-07-27T19:10:20Z

16 votes

覆盖活动的false方法,如下所示:

@Override

public boolean dispatchTouchEvent(MotionEvent ev){

return true;//consume

}

如果返回false,则所有触摸事件均被禁用。

返回false以使其正常工作

Ercan answered 2020-07-27T19:10:48Z

15 votes

您可以尝试:

your_view.setEnabled(false);

哪个应该禁用触摸事件。

或者,您可以尝试(感谢Ercan):

@Override

public boolean dispatchTouchEvent(MotionEvent ev){

return true;//consume

}

要么

public boolean dispatchTouchEvent(MotionEvent ev) {

if(!onInterceptTouchEvent()){

for(View child : children){

if(child.dispatchTouchEvent(ev))

return true;

}

}

return super.dispatchTouchEvent(ev);

}

OWADVL answered 2020-07-27T19:11:21Z

11 votes

如果且仅当inProgress变量设置为false时,这段代码基本上会将此事件传播到父视图,从而允许触摸事件。

private boolean inProgress = false;

@Override

public boolean dispatchTouchEvent(MotionEvent ev) {

if (!inProgress)

return super.dispatchTouchEvent(ev);

return true;

}

Bruno Horta answered 2020-07-27T19:11:41Z

5 votes

用这个。 返回true表示侦听器已经消耗了该事件,而android不需要执行任何操作。

view.setOnTouchListener(new View.OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

return true;

}

});

Abhishek answered 2020-07-27T19:12:01Z

3 votes

如何在所有视图上覆盖透明视图并捕获所有触摸事件呢?

Yudi answered 2020-07-27T19:12:21Z

3 votes

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,

WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

Shaleen M answered 2020-07-27T19:12:37Z

2 votes

整个应用程序可能无法实现。 您将必须为每个视图覆盖onTouchEvent()并忽略用户输入。

rajath answered 2020-07-27T19:12:57Z

1 votes

我做了这种方法,对我来说非常合适。 它禁用选定视图的所有触摸事件。

public static void disableView(View v) {

v.setOnTouchListener(new View.OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

return true;

}

});

if (v instanceof ViewGroup) {

ViewGroup vg = (ViewGroup) v;

for (int i = 0; i < vg.getChildCount(); i++) {

View child = vg.getChildAt(i);

disableView(child);

}

}

}

jan hruska answered 2020-07-27T19:13:17Z

0 votes

根据您的评论:

我只想能够在某个时候禁用当前活动的视图

您似乎想禁用当前活动的所有触摸,而不管触摸的视图如何。

在适当的时间从覆盖Activity.dispatchTouchEvent(MotionEvent)返回true将消耗触摸并有效地完成此操作。 此方法是touch方法调用链中的第一个。

SK9 answered 2020-07-27T19:13:50Z

0 votes

一种更简单的方法是通过布局(.xml)文件禁用它:只需添加

android:shouldDisableView="True"

对于要禁用的视图的触摸事件。

BhanuSingh answered 2020-07-27T19:14:14Z

0 votes

在科特林:

fun View.setEnabledRecursively(enabled: Boolean) {

isEnabled = enabled

if (this is ViewGroup)

(0 until childCount).map(::getChildAt).forEach { it.setEnabledRecursively(enabled) }

}

// usage

import setEnabledRecursively

myView.setEnabledRecursively(false)

yanchenko answered 2020-07-27T19:14:34Z

0 votes

最简单的方法是

private fun enableDisableActivty(isEnable : Boolean){

if(!isEnable) window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)

else window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)

}

Shivam Dawar answered 2020-07-27T19:14:58Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值