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 ответов
Put
android:duplicateParentState="true"
в вашем ImageView и TextView..затем мнения вам своего государственного выигрышного (целенаправленный, прессуют и т. д.) от своего непосредственного родителя, а не от самого себя.
не только для каждого ребенка:
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
.
Итак, идея в том,делегировать поведение щелчка родителю и уведомить ребенка это действительно щелкнуло, если вы хотите распространить событие. ¡¡это то, что мы ищем!!
тогда, нам нужно проверьте, какой ребенок был нажат. Вы можете найти ссылку здесь чтобы узнать, как это делается. Но идея заключается в том, чтобы получить область ребенка и спросить, кто содержит щелкнутые координаты, чтобы выполнить его действие (или нет).