我有一组FrameLayout
我希望它是可检查/可选择的,
也就是说,点击后我想要 FrameLayout
显示为 checked
- 再次按下时,我希望它变为 un checked
.更重要的是,我希望通过使用 <selector>
来像往常一样描述这个视觉问题。 .
我似乎无法正常工作 - 我不确定我错过了什么:
public class CheckableFrameLayout extends FrameLayout implements Checkable {
private boolean mChecked = false;
public CheckableFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setChecked(boolean checked) {
mChecked = checked;
refreshDrawableState();
}
public boolean isChecked() {
return mChecked;
}
public void toggle() {
setChecked(!mChecked);
}
}
CheckableFrameLayout
的布局:
<com.test.view.CheckableFrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/selector_horizontal"
android:clickable="true" >
支持它的选择器(selector_horizontal.xml):
<item android:drawable="@drawable/selector_vertical_selected" android:state_pressed="false" android:state_checked="true"/>
<item android:drawable="@drawable/selector_vertical_pressed" android:state_pressed="true" android:state_checked="false"/>
<item android:drawable="@drawable/selector_vertical_normal" android:state_pressed="false" android:state_checked="false"/>
使用上面的代码,“state_pressed”工作正常,但 View 本身没有被检查(不是通过调试发现的 Checkable
代码被调用)。
最佳答案
将以下代码添加到 Checkable
类允许选择器工作:
private static final int[] CheckedStateSet = {
android.R.attr.state_checked,
};
@Override
protected int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (isChecked()) {
mergeDrawableStates(drawableState, CheckedStateSet);
}
return drawableState;
}
@Override
public boolean performClick() {
toggle();
return super.performClick();
}
关于android - 响应选择器的自定义可检查 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11293399/