Подтвердить что ты не робот

Android: как распространять событие click для дочерних элементов LinearLayout и изменять их гибкие

Я хотел бы создать линейный макет, который будет вести себя аналогично 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 не меняют его возможности/внешний вид

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

Я попытался добавить следующий код в 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();
    }
}

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

4b9b3361

Ответ 2

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

android:duplicateParentState="true"

Но также дополнительно:

android:clickable="false"  

Это предотвратит непредвиденное поведение (или решение просто не работает), если используются clickable child views.

SO Source

Ответ 3

После такой же проблемы через несколько месяцев я нашел это решение:

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...
}