Как я могу отменить кнопки, содержащиеся в LinearLayout, от временного прослушивания щелчков? - PullRequest
1 голос
/ 09 марта 2020

У меня есть несколько кнопок, которые в зависимости от состояния приложения не имеют смысла слушать события. Есть ли свойство / метод в LinearLayout или какой-либо другой метод, который запрещает дочерним кнопкам прослушивать события? Конечно, я мог бы go найти способ отсоединить события для каждой кнопки каждую кнопку, но, конечно, я хочу go самый простой и удобный способ сделать это. Также я мог отключить все кнопки. Я узнал, что отключенные кнопки не слушают события сложным способом, когда я пытался показать тост для отключенной кнопки.

Ответы [ 2 ]

2 голосов
/ 09 марта 2020

Существует способ, которым вы можете расширить LinearLayout и переопределить его onInterceptTouchEvent и вернуть true, если вы хотите украсть сенсорные события от его дочерних элементов или false, если вы хотите, чтобы его дочерние элементы получать сенсорные события. Как то так

class CustomLinearLayout extends LinearLayout {
    //...

    private preventTouchOnChildren = false;

    public void setPreventTouchOnChildren(boolean value) {
        preventTouchOnChildren = value;
    }

    public boolean onInterceptTouchEvent (MotionEvent ev) {
        if (preventTouchOnChildren) 
            return true;
        else
            return false;
    }

    //...
}
1 голос
/ 09 марта 2020

АЛЬТЕРНАТИВА 1

Обновленный ответ! Я проверил настройку всех прослушивателей кликов для всей иерархии представления следующим образом, используя kotlin функцию расширения для класса представления

private fun View.dissableClick() {
        setOnClickListener(null)
        if (this is ViewGroup) {
            for (v in children) {
                v.setOnClickListener(null)
            }
        }
}

Так что вы можете вызвать root.dissableClick()

Вы также можете попробовать использовать isEnabled = false и v.isEnabled = false вместо setOnClickListener(null)

ALTERNATIVE 2 (Кредит @Amin Mousavi Answer)

Также из этой документации Управление событиями касания в ViewGroup, Вам необходимо создать пользовательскую группу представлений в вашем случае - пользовательскую LinearLayout

class InterceptLinearLayout @JvmOverloads constructor(
    context: Context, attr: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attr, defStyleAttr) {

    var intercept = false

    override fun onInterceptTouchEvent(ev: MotionEvent?) = when (intercept) {
        true -> true
        else -> super.onInterceptTouchEvent(ev)
    }
}

Примечание. Если вы не предоставляете перегрузки для всех суперконструкторов, ваше приложение собирается создать sh

Измените xml с <LinearLayout ... на <package.InterceptLinearLayout ...

На вашей ссылке на Activity на InterceptLinearLayout

root.intercept = true

Оба решения работали для меня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...