Android - 如何使TextView可以点击并具有选中功能

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>

更新:现在部分功能可以正常工作了。我采用了http://kmansoft.com/2011/01/11/checkable-image-button/上的大部分代码来自定义我的Textview。实际上,我还需要单选按钮的功能。 现在我可以勾选一个Textview,但是无法取消勾选。有人知道为什么会出现这种情况吗?

2个回答

8
您可以使用具有 checkMark 为空且背景为可选的 CheckedTextView。
<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>

1
天啊,我已经开发了5年,直到现在才了解CheckedTextView))。 - Zakhar Rodionov

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();
    }

}

非常感谢,到目前为止,这似乎是合理的。然而,我不确定如何实现isChecked()、setChecked(boolean a)和toggle()方法。您能给我一些提示吗? - user1995099
当用户点击时,您是否调用了 toggle()?此外,在更改状态时可能需要调用 refreshDrawableState() - Andrii Chernenko
我在toggle()方法中添加了refreshDrawableState()的调用,同时也在setCkecked(a)方法中添加了它,但是这并没有改变任何东西。我不知道如果我在点击时调用toggle(),是否需要重写一个方法? - user1995099
嗯,看起来你是从http://kmansoft.com/2011/01/11/checkable-image-button/这个网站上复制过来的。但那里他们通过XML声明styleables,所以我认为这比这个要复杂一些。 - user1995099
它仍然无法工作。尽管我已经删除了onCreateDrawableState()中的“if”部分,因为它引用了CHECKED_STATE_SET,在我之前的评论示例中,它引用了一些可定制的样式。 - user1995099
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接