Android - как получить интерактивное и проверяемое текстовое представление

Я хочу иметь следующее: текстовое представление, которое.) Изменяет свой фон при щелчке.) Поддерживает этот фон, пока оно не будет нажато снова

все сводится к "проверяемому" состоянию, но я не мог понять, как именно это работает. Вот 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 ответа

Вы можете использовать CheckedTextView с пустым checkMark и фон по вашему выбору

<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>

Сделать кастом 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();
    }

}
Другие вопросы по тегам