Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 禁用所有视图的触摸事件_Android_Android View_Touch Event - Fatal编程技术网

Android 禁用所有视图的触摸事件

Android 禁用所有视图的触摸事件,android,android-view,touch-event,Android,Android View,Touch Event,禁用所有视图的触摸事件的最佳方法是什么?对于整个应用程序可能不可能。您必须为每个视图重写onTouchEvent(),并忽略用户输入。您可以尝试: your_view.setEnabled(false); 这将禁用触摸事件 或者,您可以尝试(感谢Ercan): 或 以下是用于禁用某个视图组的所有子视图的函数: /** * Enables/Disables all child views in a view group. * * @param viewGroup the v

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

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

您可以尝试:

your_view.setEnabled(false);
这将禁用触摸事件

或者,您可以尝试(感谢Ercan):


以下是用于禁用某个视图组的所有子视图的函数:

 /**
   * 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
所有触摸事件都将被禁用


Return
false
让它们正常工作

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

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);
        }
    }
}
公共静态无效禁用视图(视图v){
v、 setOnTouchListener(新视图。OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
返回true;
}
});
if(视图组的v实例){
视图组vg=(视图组)v;
对于(int i=0;i
根据您的评论:

我只想在某个时候禁用当前活动的视图

您似乎希望禁用当前活动的所有触摸,而不考虑触摸的视图


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

更简单的方法是通过布局(即.xml)文件禁用它: 加上

 android:shouldDisableView="True"

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

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

private boolean inProgress = false;

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

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

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

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)

最简单的方法是

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

这对我很有效,我创建了一个空方法,并将其称为
doNothing

   public void doNothing(View view)
{

}
然后从
onClick
event对我想要禁用触摸事件的所有对象调用此方法<代码>android:onClick=“doNothing”



触发单击或触摸事件时,不会处理任何内容。

对不起,此更改的目标是什么?您可以创建一个递归过程来更改每个viewsetEnabled(false)的onTouchEvent();在根目录布局上,您希望用户仅使用按钮吗?在android设备上?;)@T0X1C:这正是我想要的。但是它不起作用。@yosh:我不想永远禁用它们。我只是希望能够在某个时候禁用当前活动的视图。如果ListView是“your_view”-ViewGroups的子级,则这对ListView元素不起作用。这不会为子级禁用触摸views@peceps不幸的是,它不适用于片段。例如,如果
ViewGroup
有一个子片段,在
FragmentTransaction
中添加的
片段及其子对象不会被禁用。@AlexAndro:我仍然使用了通过
FrameLayout
添加的
片段的方法,效果非常好。此解决方案假定视图组中的所有视图都是视图组的直接子对象。然而,通常情况并非如此。我现在也在考虑这一点,但从孩子的角度来涵盖一切不是很困难吗?它不会被限制为其直接父级的大小吗?欢迎使用堆栈溢出!我编辑了你的答案;通过将代码缩进4个空格,将其放入
代码标记中
。一般来说,在这里发布答案时,除了代码之外,最好提供一些解释。虽然此代码片段可能解决问题,但确实有助于提高您的帖子质量。请记住,您将在将来为读者回答这个问题,而这些人可能不知道您的代码建议的原因。我将颠倒
if
语句,以避免不必要的负面影响。逻辑上是等效的,但减少了出错的可能性(not符号“!”很容易漏掉)。如果您有像我这样的奇怪用例需要,这个答案将允许您在启用视图的同时禁用触摸事件。在使用拖放的情况下很有用(我的案例)。谢谢在视图上工作。不在视图组上。视图组中的子视图仍然能够接收单击事件。我的活动保留一个RecyclerView,无论返回的是true还是false,如果我覆盖该方法,所有触摸事件都将被禁用。有吗idea@K.Dexter您可能忘记调用super.dispatchTouchEvent(ev)
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)
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)
    } 
   public void doNothing(View view)
{

}