2012-04-16 20 views
12

Tôi muốn tạo bố cục tuyến tính sẽ hoạt động tương tự như ImageButton.Android: Cách truyền bá sự kiện nhấp chuột cho con LinearLayout và thay đổi 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> 

Theo kiểu ImageView, TextView và LinearLayout, tôi đặt bộ chọn cho tất cả các trạng thái.

Bây giờ là:

  • khi tôi bấm vào ImageView (Tôi đã thử nó cũng có ImageButton) - nó cư xử một cách chính xác và hình ảnh được thay đổi theo xml chọn.
  • khi tôi bấm vào LinearLayout - cách bố trí tuyến tính được nhấp, nhưng các ImageView và TextView không thay đổi đó là drawable/xuất hiện

Vì vậy, tôi muốn làm những điều sau đây. Khi tôi bấm vào LinearLayout mẹ, tôi cần phải thay đổi tất cả các con của nó thành trạng thái nhấn.

Tôi cố gắng để thêm mã sau đây để LinearLayout OnClickListener để hoằng dương nhấp chuột:

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

Nhưng nó vẫn reamins giống nhau. Cảm ơn bạn rất nhiều sự giúp đỡ nào.

Trả lời

38

Đặt

android:duplicateParentState="true" 

trong ImageView và TextView của bạn .. then the views get its drawable state (focused, pressed, etc.) from its direct parent rather than from itself.

+0

CÓ! Đó là nó! Cảm ơn bạn ... – Bhiefer

+0

android: duplicateParentState = "true" không hoạt động đối với tôi, bất kỳ ý tưởng nào tại sao? –

+1

Tôi có cùng sự cố nhưng nhấp chuột hoạt động và công cụ chọn không hoạt động, bất kỳ ý tưởng nào? –

0

Sau khi có cùng một vấn đề vài tháng sau đó, tôi thấy giải pháp này:

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

Không chỉ làm cho mọi con:

android:duplicateParentState="true" 

Nhưng cũng bổ sung:

android:clickable="false" 

Điều này sẽ ngăn chặn hành vi bất ngờ (hoặc giải pháp đơn giản là không làm việc) nếu views con có thể click được sử dụng.

SO Source

Các vấn đề liên quan