Ответ 1
Я бы создал ViewGroup
со всеми представлениями, которые вы хотите включить/отключить одновременно, и вызовите setClickable(true/false)
, чтобы включить/отключить нажатие.
У меня есть макет, содержащий много просмотров. Есть ли простой способ отключить все события просмотра событий?
Я бы создал ViewGroup
со всеми представлениями, которые вы хотите включить/отключить одновременно, и вызовите setClickable(true/false)
, чтобы включить/отключить нажатие.
Вы можете передать 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);
}
}
}
Вместо того, чтобы повторять просмотр всех дочерних элементов, вы можете добавить эту функцию в родительский вид макета
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return true;
}
Это будет вызываться перед onTouchEvent
для любых дочерних представлений, и если он вернет true
, просмотр onTouchEvent
для дочерних просмотров вообще не будет вызван. Вы можете создать логический элемент поля для включения и выключения этого состояния, если хотите.
Вам нужно вызвать метод setEnabled(boolean value)
в представлении.
view.setClickable(false);
view.setEnabled(false);
Сделайте логическое clickEnabled
в своей деятельности и проверьте его в прослушивателях кликов; если он ложный, ничего не делайте.
Вот реализация функции расширения Kotlin ответа Параг Чаухана
fun View.setAllEnabled(enabled: Boolean) {
isEnabled = enabled
if (this is ViewGroup) children.forEach { child -> child.setAllEnabled(enabled) }
}
Если вы не хотите устанавливать все дочерние представления для отключения состояния (поскольку они могут выглядеть по-разному для включения состояния), вы можете использовать этот подход:
private fun toogleTouchable(canTouch: Boolean) {
container.descendantFocusability =
if (value) {
container.requestFocus()
ViewGroup.FOCUS_BLOCK_DESCENDANTS
} else {
ViewGroup.FOCUS_AFTER_DESCENDANTS
}
}
Я бы реализовал интерфейс onClickListener
в вашем классе активности и вернул false в метод onClick
. Я считаю, что это самый простой способ решить вашу проблему.