禁用所有视图的触摸事件

时间:2011-03-24 11:38:44

标签: android

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

非常感谢,

的Gratzi

13 个答案:

答案 0 :(得分:54)

以下是禁用某些视图组的所有子视图的功能:

 /**
   * 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);
      }
    }
  }

答案 1 :(得分:16)

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

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

如果您返回true,则会禁用所有触摸事件。

返回false让它们正常工作

答案 2 :(得分:14)

你可以尝试:

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);
}

答案 3 :(得分:11)

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

false

答案 4 :(得分:4)

使用它。返回true表示监听器已经消耗了该事件,并且android不需要做任何事情。

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

答案 5 :(得分:3)

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

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

答案 8 :(得分:0)

根据你的评论:

  

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

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

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

答案 9 :(得分:0)

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

 android:shouldDisableView="True"

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

答案 10 :(得分:0)

在科特林:

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)

答案 11 :(得分:0)

最简单的方法是

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)

}

答案 12 :(得分:0)

这对我有用,我创建了一个空方法并将其命名为 doNothing

   public void doNothing(View view)
{

}

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

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