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.

3 Solutions collect form web for “Android: Cómo propagar el evento de clic a los hijos de LinearLayout y cambiar su drawable”

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... } 
  • Cómo implementar un oyente de clic largo y onclicklistener en listview único
  • Android cómo escribir clic evento de un ImageView
  • Toast dentro del método onClick en Fragment
  • ¿Una mejor manera de hacer clic en OnClick para los campos EditText?
  • ¿Cómo exactamente el atributo android: onClick XML difiere de setOnClickListener?
  • Android, ¿Cómo puedo obtener texto de TextView en OnClick
  • OnClick PendingIntent en widget a veces no funciona
  • Fragmento onListItemClick
  • Android para detectar cuando se mantiene pulsado un botón
  • ¿Cómo puedo detectar un clic en el título de ActionBar?
  • Cómo borrar el edittext cuando onclick en el botón
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.