57

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

4

14 回答 14

60

这是一个禁用某个视图组的所有子视图的函数:

 /**
   * 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);
      }
    }
  }
于 2012-01-13T11:12:15.333 回答
20

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

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

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

返回false让他们正常工作

于 2015-02-10T10:27:44.997 回答
18

You could try:

your_view.setEnabled(false);

Which should disable the touch events.

alternatively you can try (thanks to Ercan):

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

or

public boolean dispatchTouchEvent(MotionEvent ev) {
    if(!onInterceptTouchEvent()){
        for(View child : children){
            if(child.dispatchTouchEvent(ev))
                return true;
        }
    }
    return super.dispatchTouchEvent(ev);
}
于 2011-12-13T13:12:53.437 回答
14

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

private boolean inProgress = false;

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (!inProgress)
        return super.dispatchTouchEvent(ev);
    return true;
 }
于 2016-09-15T09:09:01.203 回答
9

用这个。返回 true 表示监听器已经消费了事件,android 不需要做任何事情。

view.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return true;
    }
});
于 2017-04-21T15:02:12.417 回答
4

覆盖所有视图的透明视图并捕获所有触摸事件怎么样?

于 2013-08-01T07:19:11.583 回答
4
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                     WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
于 2017-02-25T22:33:39.943 回答
4

在科特林:

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)
于 2019-06-06T11:44:17.353 回答
3

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

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);
        }
    }
}
于 2015-09-11T08:07:10.493 回答
2

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

于 2011-03-24T11:50:01.070 回答
2

最简单的方法是

private fun setInteractionDisabled(disabled : Boolean) {
  if (disabled) {
    window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
  } else {
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
  }
} 
于 2019-07-29T09:21:08.093 回答
0

这对我有用,我创建了一个空方法并调用它doNothing

   public void doNothing(View view)
{

}

onClick然后从我想禁用触摸事件的所有对象 的事件中调用此方法。android:onClick="doNothing"

当点击或触摸事件被触发时,没有任何处理。

于 2021-06-08T11:07:04.063 回答
0

根据您的评论:

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

无论触摸的视图如何,您似乎都想禁用当前活动的所有触摸。

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

于 2015-09-27T04:07:44.787 回答
-2

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

 android:shouldDisableView="True"

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

于 2016-07-26T09:58:06.797 回答