2012-04-16 10 views
12

Vorrei creare un layout lineare che si comporterebbe in modo simile a ImageButton.Android: come propagare l'evento click ai child di LinearLayout e modificarne il 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> 

negli stili di ImageView, TextView e LinearLayout, Ho impostato un selettori per tutti gli stati.

Ora:

  • quando clicco su ImageView (ho provato anche con ImageButton) - si comporta correttamente e l'immagine viene modificata in base xml selettore.
  • quando clicco sul LinearLayout - la disposizione lineare viene cliccato, ma la l'ImageView e TextView non cambiano è drawable/aspetto

quindi vorrei fare quanto segue. Quando clicco su LinearLayout padre, ho bisogno di cambiare tutto lo stato di childs in stato premuto.

Ho provato ad aggiungere seguente codice LinearLayout onClickListener per propagare il 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(); 
    } 
} 

Ma Reamins ancora lo stesso. Grazie mille per qualsiasi aiuto.

risposta

0

Dopo avere lo stesso problema qualche mese dopo, ho trovato questa soluzione:

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

Non solo fare per ogni child:

android:duplicateParentState="true" 

Ma anche in aggiunta:

android:clickable="false" 

Questo consentirà di evitare un comportamento imprevisto (o soluzione semplicemente non funziona) se vengono utilizzati viste bambino cliccabili.

SO Source

Problemi correlati