Как отключить все события щелчка макета?

У меня есть макет, содержащий много просмотров. Есть ли простой способ отключить все события просмотра событий?

Ответы

Ответ 1

Я бы создал ViewGroup со всеми представлениями, которые вы хотите включить/отключить одновременно, и вызовите setClickable(true/false), чтобы включить/отключить нажатие.

Ответ 2

Вы можете передать 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);
            }
        }
    }

Ответ 3

Вместо того, чтобы повторять просмотр всех дочерних элементов, вы можете добавить эту функцию в родительский вид макета

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return true;
}

Это будет вызываться перед onTouchEvent для любых дочерних представлений, и если он вернет true, просмотр onTouchEvent для дочерних просмотров вообще не будет вызван. Вы можете создать логический элемент поля для включения и выключения этого состояния, если хотите.

Ответ 4

Вам нужно вызвать метод setEnabled(boolean value) в представлении.

view.setClickable(false);
view.setEnabled(false);

Ответ 5

Сделайте логическое clickEnabled в своей деятельности и проверьте его в прослушивателях кликов; если он ложный, ничего не делайте.

Ответ 6

Вот реализация функции расширения Kotlin ответа Параг Чаухана

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

Ответ 7

Если вы не хотите устанавливать все дочерние представления для отключения состояния (поскольку они могут выглядеть по-разному для включения состояния), вы можете использовать этот подход:

private fun toogleTouchable(canTouch: Boolean) {
        container.descendantFocusability =
                if (value) {
                    container.requestFocus()
                    ViewGroup.FOCUS_BLOCK_DESCENDANTS
                } else {
                    ViewGroup.FOCUS_AFTER_DESCENDANTS
                }
    }

Ответ 8

Я бы реализовал интерфейс onClickListener в вашем классе активности и вернул false в метод onClick. Я считаю, что это самый простой способ решить вашу проблему.