Android: Cómo propagar el evento de clic a los hijos de LinearLayout y cambiar su drawable

Quisiera crear una disposición linear que se comportaría similar a 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> 

En estilos de ImageView, TextView y LinearLayout, establezco selectores para todos los estados.

Ahora:

  • Cuando hago clic en ImageView (lo intenté también con ImageButton) – se comporta correctamente y la imagen se cambia de acuerdo al selector xml.
  • Cuando hago clic en LinearLayout – se hace clic en el diseño lineal, pero el ImageView y TextView no cambian su aspecto / aspecto

Así que me gustaría hacer lo siguiente. Cuando hago clic en LinearLayout padre, necesito cambiar todos los childs a estado presionado.

He intentado añadir el siguiente código a LinearLayout onClickListener para propagar el clic:

 @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(); } } 

Pero todavía reamins lo mismo. Muchas gracias por cualquier ayuda.

Poner

 android:duplicateParentState="true" 

En su ImageView y TextView .. entonces las vistas obtienen su estado dibujable (enfocado, presionado, etc.) de su padre directo en lugar de de sí mismo.

No sólo para cada niño:

 android:duplicateParentState="true" 

Pero también adicionalmente:

 android:clickable="false" 

Esto evitará un comportamiento inesperado (o la solución simplemente no funcionará) si se utilizan vistas secundarias que se pueden hacer clic .

SO Fuente

Después de tener el mismo problema unos meses más tarde, encontré esta solución:

 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... } 
  • Evento onClick no está desencadenando | Androide
  • Cómo implementar un oyente de clic largo y onclicklistener en listview único
  • Haga que un botón de Android cambie el fondo al hacer clic en XML
  • Evento OnClick para un botón en una notificación personalizada
  • Forzar un elemento ListView para permanecer "presionado" después de haber hecho clic?
  • ButterKnife onclick no funciona
  • Cómo capturar el evento onclick en disabled EditText en la aplicación de Android
  • Cambiar vista en el flujo de portada - Android
  • Ocultar el teclado cuando el usuario teclea en cualquier otro lugar de la pantalla en android
  • ¿Una mejor manera de hacer clic en OnClick para los campos EditText?
  • ¿Cómo implementar onclick en javascript y html para dispositivos con versiones inferiores de android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.