2015-11-03 76 views
1

我使用:基於this勾選的佈局層次

public class CheckableRelativeLayout extends RelativeLayout implements Checkable { 

    private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked, }; 

    private boolean mChecked; 

    public CheckableRelativeLayout(Context context) { 
     super(context); 
    } 

    public CheckableRelativeLayout(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public CheckableRelativeLayout(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public void setChecked(boolean checked) { 
     if (mChecked != checked) { 
      mChecked = checked; 
      refreshDrawableState(); 
     } 
    } 

    @Override 
    public boolean isChecked() { 
     return mChecked; 
    } 

    @Override 
    public void toggle() { 
     setChecked(!mChecked); 
    } 

    @Override 
    protected int[] onCreateDrawableState(int extraSpace) { 
     final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); 
     if (isChecked()) { 
      mergeDrawableStates(drawableState, CHECKED_STATE_SET); 
     } 
     return drawableState; 
    } 

} 

我用它是這樣的:在selector_background_navigation_item這樣定義的列表項

<com.example.components.CheckableRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/CheckableRelativeLayout1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/selector_background_navigation_item" 
    android:orientation="horizontal" 
    android:padding="10dp" 
    android:gravity="center_vertical" > 

    <ImageView 
     android:id="@+id/navigationDrawerItemImageView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:id="@+id/navigationDrawerItemTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignTop="@+id/navigationDrawerItemImageView" 
     android:layout_margin="5dp" 
     android:layout_toRightOf="@+id/navigationDrawerItemImageView" 
     android:textColor="@drawable/selector_text_navigation_item" 
     android:textSize="@dimen/text_size_small" /> 

</com.example.components.CheckableRelativeLayout> 

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:state_checked="false" android:state_pressed="false" android:drawable="@color/darkblue"></item> 
    <item android:state_pressed="true" android:drawable="@color/sirinblue"></item> 
    <item android:state_checked="true" android:drawable="@color/white"></item> 
</selector> 

和像這樣定義的selector_text_navigation_item:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:state_checked="false" android:state_pressed="false" android:color="@color/white"></item> 
    <item android:state_pressed="true" android:color="@color/lightblue"></item> 
    <item android:state_checked="true" android:color="@color/lightblue"></item> 
</selector> 

現在的問題是,TextView的選擇並沒有檢查事件做出響應,而CheckableRelativeLayout做,但都正確地壓簡單迴應,最新最好的方式來解決這一問題?也許CheckableRelativeLayout缺少一些處理其子選中狀態的超級調用?

回答

0

向TextView添加android:duplicateParentState =「true」的確有竅門!