禁用所有视图的触摸事件

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

非常感谢,

的Gratzi

这是禁用某些视图组的所有子视图的function:

/** * Enables/Disables all child views in a view group. * * @param viewGroup the view group * @param enabled <code>true</code> to enable, <code>false</code> 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); } } } 

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

 @Override public boolean dispatchTouchEvent(MotionEvent ev){ return true;//consume } 

如果返回true所有触摸事件都被禁用。

返回false让他们正常工作

你可以尝试:

 your_view.setEnabled(false); 

应该禁用触摸事件。

这段代码基本上将这个事件传播给父视图,当且仅当inProgressvariables设置为false时才允许触摸事件。

 private boolean inProgress = false; @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (!inProgress) return super.dispatchTouchEvent(ev); return true; } 

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

整个应用程序可能不可能。 您将不得不为每个视图重写onTouchEvent(),并忽略用户input。

用这个。 返回true将表明侦听器已经消耗了事件,android不需要做任何事情。

 view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } }); 

我做了这个方法,这对我来说很完美。 它禁用所选视图的所有触摸事件。

 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); } } } 
 getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 

根据您的评论:

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

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

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

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

  android:shouldDisableView="True" 

为您要禁用触摸事件的视图。