3

我想要以下内容:一个文本视图。)单击时更改其背景。)保持该背景,直到再次单击它

这一切都归结为“可检查”状态,但我无法弄清楚这到底是如何工作的。这是我用于背景的 xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<!-- pressed -->
<item android:drawable="@drawable/menuselected"
android:state_pressed="true" />

<!-- checked -->
<item android:drawable="@drawable/menuselected"
android:state_checked="true" />

<!-- default -->
<item android:drawable="@drawable/transpixel"/>

</selector>

更新:它现在部分工作。我为我的自定义 Textview采用了来自http://kmansoft.com/2011/01/11/checkable-image-button/的大部分代码。实际上,我这样做了,我也需要单选按钮的功能。现在我可以检查一个 Textview,但我不能取消选中它。有人知道为什么会这样吗?

4

2 回答 2

8

您可以将 CheckedTextView 与 checkMark null 和背景一起使用,您可以选择

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checkMark="@null"
    android:background="@drawable/selectable"/>

你的选择可以是

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:drawable="@drawable/selector" />
</selector>
于 2014-04-04T21:04:46.077 回答
1

制作自定义TextView实现android.widget.Checkable接口。这应该足以使您的选择器工作。

下面是示例实现:

public class CheckableTextView extends TextView implements Checkable {
    private boolean isOn=false;

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

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

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

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

    @Override
    public void setChecked(boolean checked) {
        isOn=checked;
        refreshDrawableState();
    }

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

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

}
于 2013-05-20T11:47:51.943 回答