2012-04-16 9 views
12

Me gustaría crear un diseño lineal que se comporte de manera similar a ImageButton.Android: Cómo propagar el evento click a LinearLayout childs y cambiar su drawable

<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, Vista de Texto y LinearLayout, fijo una selectores para todos los estados.

Ahora:

  • cuando hago clic en ImageView (I trató también con ImageButton) - se comporta correctamente y la imagen se cambia según el xml selector.
  • cuando hago clic en LinearLayout - la disposición lineal se hace clic, pero el ImageView y TextView no cambian su apariencia estirable/

Así que me gustaría hacer lo siguiente. Cuando hago clic en LinearLayout principal, necesito cambiar todo el estado de los elementos secundarios al presionado.

He intentado añadir siguiente código para 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 la misma. Muchas gracias por cualquier ayuda.

Respuesta

0

Después de tener el mismo problema algunos meses más tarde, me encontré con 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... 
} 
2

No sólo hacer para cada niño:

android:duplicateParentState="true" 

Pero también adicionalmente:

android:clickable="false" 

Esto evitará un comportamiento inesperado (o solución simplemente no funciona) si se utilizan se puede hacer clic vistas secundarias.

SO Source

Cuestiones relacionadas