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