如何禁用布局的所有点击事件?

Jus*_*tMe 21 android android-layout

我有一个包含许多视图的布局.是否有一种简单的方法可以禁用其所有视图点击事件?

Par*_*han 39

您可以通过View禁用所有子点击事件.

public static void enableDisableView(View view, boolean enabled) {
        view.setEnabled(enabled);
        if ( view instanceof ViewGroup ) {
            ViewGroup group = (ViewGroup)view;

            for ( int idx = 0 ; idx < group.getChildCount() ; idx++ ) {
                enableDisableView(group.getChildAt(idx), enabled);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • @FARID 通过enableDisableView(linView,false); 它应该有效 (2认同)

Cam*_*ham 26

您可以将此函数添加到父布局视图,而不是遍历所有子视图

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

这将在onTouchEvent任何子视图之前调用,如果返回true,则根本onTouchEvent不会调用for子视图.您可以创建一个布尔字段成员,以根据需要打开和关闭此状态.


khe*_*ang 13

我将创建一个ViewGroup包含您想要同时启用/禁用的所有视图,并调用setClickable(true/false)启用/禁用单击.


Aid*_*ing 8

这是Parag Chauhan 的答案的 Kotlin 扩展函数实现

fun View.setAllEnabled(enabled: Boolean) {
    isEnabled = enabled
    if (this is ViewGroup) children.forEach { child -> child.setAllEnabled(enabled) }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意@letterman549,如果您的“ViewGroup”中有一个“RecyclerView”,则这不适用于所有子项。它似乎适用于 RecyclerView 的前几个项目,但当您滚动时,视图不会全部设置为指定的布尔值。 (2认同)

Ash*_*ini 5

您需要setEnabled(boolean value)在视图上调用方法.

view.setClickable(false);
view.setEnabled(false);
Run Code Online (Sandbox Code Playgroud)

  • 对我不起作用,孩子们仍然有行动 (9认同)