自定义可检查视图这是为了响应选择(Custom Checkable View which respo

2019-07-30 05:31发布

我有一组FrameLayout ,我想成为可检查/选择,

也就是说,点击后,我希望FrameLayout显示为checked -按下时,我再次希望它成为联合国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_horizo​​ntal.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”工作正常,但视图本身变得不检查(不是Checkable代码通过调试发现被调用)。

Answer 1:

添加以下代码到一个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();
}


Answer 2:

下面是一个CheckableButton一个完整的工作示例。 这也适用于Android 4.2。

public class CheckableButton extends Button implements Checkable {

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

    private boolean mChecked = false;

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

    public CheckableButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

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

    @Override
    public void setChecked(boolean 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, CheckedStateSet);
        }
        return drawableState;
    }
}


Answer 3:

尝试使用android:state_activated

<item android:drawable="@color/HighlightColor"      android:state_activated="true"/> 

从文档 :

对于StateListDrawable状态值,当设置视图或其父已被“激活”,这意味着用户目前已经将其标记为感兴趣。



Answer 4:

尝试在重新排序标签selector_horizontal.xml这些评估从上到下。 看来,在你的情况下,或者android:state_pressed="false" or android:state_pressed="true"应用和评价永远不会达到与第三行android:state_checked="true"尝试移动第一行到最后:

<item android:drawable="@color/HighlightColor" android:state_pressed="true"/>
<item android:drawable="@color/selected_color" android:state_checked="true"/>
<item android:drawable="@android:color/transparent" android:state_pressed="false"/>


Answer 5:

除了格雷姆的回答上面做以下修改切换()

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


Answer 6:

格雷姆的解决方案并没有从我的Android 4.0.3下工作(我想这不会在4.0工作太)。 相反,你可以改变state_checkedstate_activated

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/activated_image" android:state_pressed="false" android:state_activated="true" />
    <item android:drawable="@drawable/not_activated_image" android:state_pressed="false" android:state_activated="false"/>

</selector>

并使用setActivated您的内部setChecked

@Override
public void setChecked(boolean checked) {
    mChecked = checked;
    setActivated(checked);
}

那就是所有。 实施onCreateDrawableState这里不需要。



文章来源: Custom Checkable View which responds to Selector