在使用selector的时候我们发现只有button checkbox才能使用某些状态
我现在有个需求 想让点击时整个布局改变状态 于是自己手动自定义了一个可以实现该效果的linearlayout
按照这个思路所有的布局都能实现该效果 不废话了直接粘贴代码
package com.langteng.qingdao.toolbar; import android.content.Context; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.widget.Checkable; import android.widget.LinearLayout; /** * Created by fenghao on 2018/5/30. dehaofeng@126.com */ public class CheckableLinearLayout extends LinearLayout implements Checkable { //该布局使用前的 boolean mChecked = false; private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked }; public CheckableLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); setClickable(true); } public CheckableLinearLayout(Context context) { super(context); setClickable(true); } @Override public boolean isChecked() { return mChecked; } @Override public void setChecked(boolean checked) { if (mChecked != checked) { mChecked = checked; refreshDrawableState(); } } @Override public void toggle() { mChecked = !mChecked; refreshDrawableState(); } @Override protected int[] onCreateDrawableState(int extraSpace) { final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); if (isChecked()) { mergeDrawableStates(drawableState, CHECKED_STATE_SET); } return drawableState; } @Override public boolean performClick() { toggle(); return super.performClick(); } }
package com.langteng.qingdao.toolbar; import android.content.Context; import android.support.v7.widget.AppCompatImageView; import android.util.AttributeSet; import android.widget.Checkable; import android.widget.ImageView; /** * Created by fenghao on 2018/5/30. dehaofeng@126.com */ public class CheckableImageView extends AppCompatImageView implements Checkable { private boolean mChecked; private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked }; public CheckableImageView(Context context, AttributeSet attrs) { super(context, attrs); setClickable(true); } public CheckableImageView(Context context) { super(context); setClickable(true); } @Override public int[] onCreateDrawableState(int extraSpace) { final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); if (isChecked()) { mergeDrawableStates(drawableState, CHECKED_STATE_SET); } return drawableState; } public void toggle() { setChecked(!mChecked); } public boolean isChecked() { return mChecked; } public void setChecked(boolean checked) { if (mChecked != checked) { mChecked = checked; refreshDrawableState(); } } @Override public boolean performClick() { toggle(); return super.performClick(); } }