Ответ 1
Положите
android:duplicateParentState="true"
в вашем ImageView и TextView.. тогда представления получают свое выталкиваемое состояние (сфокусированное, нажатое и т.д.) из его прямого родителя, а не из него.
Я хотел бы создать линейный макет, который будет вести себя аналогично 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 я устанавливал селектора для всех состояний.
Сейчас:
Поэтому я хотел бы сделать следующее. Когда я нажимаю на родительский 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();
}
}
Но он все равно повторяет то же самое. Большое вам спасибо за любую помощь.
Положите
android:duplicateParentState="true"
в вашем ImageView и TextView.. тогда представления получают свое выталкиваемое состояние (сфокусированное, нажатое и т.д.) из его прямого родителя, а не из него.
Не только для каждого ребенка:
android:duplicateParentState="true"
Но также дополнительно:
android:clickable="false"
Это предотвратит непредвиденное поведение (или решение просто не работает), если используются clickable child views.
После такой же проблемы через несколько месяцев я нашел это решение:
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...
}