禁用所有视图的触摸事件

Gra*_*tzi 43 android

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

非常感谢,

的Gratzi

pec*_*eps 55

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

 /**
   * 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);
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

  • @peceps很遗憾它不适用于片段.例如,如果`ViewGroup`有一个片段子元素,则在`FragmentTransaction`中添加`fragment`,它的子元素不会被禁用. (7认同)

Erc*_*can 17

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

@Override
public boolean dispatchTouchEvent(MotionEvent ev){      
  return true;//consume
}
Run Code Online (Sandbox Code Playgroud)

如果返回,true则禁用所有触摸事件.

返回false让他们正常工作

  • @K.Dexter 你可能忘记调用 `super.dispatchTouchEvent(ev)` (4认同)

OWA*_*DVL 15

你可以尝试:

your_view.setEnabled(false);
Run Code Online (Sandbox Code Playgroud)

哪个应该禁用触摸事件.

或者你可以试试(感谢Ercan):

@Override
public boolean dispatchTouchEvent(MotionEvent ev){      
  return true;//consume
}
Run Code Online (Sandbox Code Playgroud)

要么

public boolean dispatchTouchEvent(MotionEvent ev) {
    if(!onInterceptTouchEvent()){
        for(View child : children){
            if(child.dispatchTouchEvent(ev))
                return true;
        }
    }
    return super.dispatchTouchEvent(ev);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果ListView是'your_view'-ViewGroup的子级,则不适用于ListView元素 (3认同)
  • 这不会禁用子视图的触摸 (3认同)

小智 11

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

private boolean inProgress = false;

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (!inProgress)
        return super.dispatchTouchEvent(ev);
    return true;
 }
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码段可以解决问题,但[包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高帖子的质量.请记住,您将来会回答读者的问题,而这些人可能不知道您的代码建议的原因. (2认同)

Shi*_*war 6

最简单的方法是

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)
  }
} 
Run Code Online (Sandbox Code Playgroud)


小智 5

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


Abh*_*hek 5

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

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


raj*_*ath 2

对于整个应用程序来说这可能是不可能的。您必须为每个视图重写 onTouchEvent() 并忽略用户输入。