Android: как распространить событие click на LinearLayout childs и изменить их drawable

Я хотел бы создать линейный макет, который будет вести себя аналогично ImageButton.

<LinearLayout
    android:id="@+id/container"
    style="?WidgetHomeIconContainer">            

    <ImageView
        android:id="@+id/icon"
        style="?WidgetHomeIcon" />

    <TextView
        android:id="@+id/title"
        style="?WidgetHomeLabel"             
        android:text="@string/title"
        android:textAppearance="?attr/TextHomeLabel" />
</LinearLayout>

в стилях ImageView, TextView и LinearLayout я устанавливаю селекторы для всех состояний.

теперь:

  • когда я нажимаю на ImageView (я пробовал его также с ImageButton) - он ведет себя правильно, и изображение изменяется в соответствии с селектором xml.
  • когда я нажимаю на LinearLayout-щелкается линейный макет, но ImageView и TextView не изменяет его drawable / appearance

поэтому я хотел бы сделать следующее. Когда я нажимаю на родительский LinearLayout, мне нужно изменить все это childs на нажатое состояние.

Я попытался добавить следующий код в LinearLayout onClickListener для распространения щелчка:

@Override
public void onClick(View v)
{
    LinearLayout l = (LinearLayout) v;
    for(int i = 0; i < l.getChildCount(); i++)
    {
        l.getChildAt(i).setClickable(true);
        l.getChildAt(i).performClick();
    }
}

но он по-прежнему развертывает то же самое. Большое спасибо за любую помощь.

4 ответов



не только для каждого ребенка:

android:duplicateParentState="true"

а также:

android:clickable="false"  

это предотвратит неожиданное поведение (или решение просто не работает), если кликабельный вид ребенка есть.

так Источник


после того, как у меня была та же проблема несколько месяцев спустя, я нашел это решение:

private void setOnClickListeners() {
    super.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            onClick(v);
        }
    });
    for (int index = 0; index < super.getChildCount(); index++) {
        View view = super.getChildAt(index);
        view.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                onClick(v);
            }
        });
    }
}

protected void onClick(View v) {
    // something to do here...
}

в моем случае ни одно из других решений не работает!

мне, наконец, пришлось использовать OnTouchListener Как пояснил здесь, захват события, когда пользователь щелкает в Родительском представлении, и удаление всех детей OnClickListener.

Итак, идея в том,делегировать поведение щелчка родителю и уведомить ребенка это действительно щелкнуло, если вы хотите распространить событие. ¡¡это то, что мы ищем!!

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