TextView 背景随选择器变化

问题描述 投票:0回答:1

在选择器的帮助下尝试对

TextView
背景进行鼠标操作时着色:

selector2.xml
的内容:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@android:color/holo_green_dark" />
    <item android:state_focused="true" android:drawable="@android:color/darker_gray" />
    <item android:state_pressed="true" android:drawable="@android:color/holo_blue_bright" />
    <item android:drawable="@android:color/holo_blue_dark" />
</selector>
布局文件中的

TextView

            <TextView
                android:background="@drawable/selector2"
                android:textColor="@color/color_mk_white"
                android:text="Temperature"
                android:layout_height="fill_parent"
                android:layout_width="fill_parent"
                android:gravity="center"
                ></TextView>

当程序启动时,我得到带有蓝色背景的

TextView
,并且它对鼠标单击没有反应。如何在鼠标操作时改变背景颜色?

android textview
1个回答
0
投票

如果您深入研究 Android 代码并查看 TextView 的代码,您会发现它没有实现 Checkable 接口,就好像您看到单选按钮、芯片等的代码一样,它们实现了 Checkable 接口。现在,为了实现此行为,我通过制作可检查的 FrameLayout 做了类似的事情。

ChekableFrameLayout

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

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

编写完这段代码后,我在 Xml 中使用了它,如下所示:

 <com.example.CheckableFrameLayout 
android:id="@+id/chipsSelectedDay"
android:layout_width="65dp"
android:layout_height="65dp"
android:background="@drawable/checked_unchecked_drawable"
android:clickable="true"
android:descendantFocusability="blocksDescendants"
android:focusable="true"
android:paddingVertical="11dp">

<TextView
    android:id="@+id/tvDay"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="top"
    android:duplicateParentState="true"
    android:ellipsize="end"
    android:gravity="center_horizontal"
    android:maxLines="1"
    android:singleLine="true"
    android:textColor="#838D99"
    android:textSize="12sp"
    tools:text="Sun" /></com.example.CheckableFrameLayout>

对于背景checked_unchecked_drawable:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/consultme_slot_selected_drawable_bg"/>
<item android:state_checked="false" android:drawable="@drawable/consultme_slot_unselected_drawable_bg"/>
</selector>

现在使用这个 CheckableFrameLayout 我们可以实现所需的属性。您可以对 Textview 执行相同的操作。但我必须实现这个,因为我必须创建一个包含两行文本的布局,每行文本具有不同的样式,并且 Chip 不允许多行文本。 但看到你的用例,我想你应该去芯片实现。无论如何希望这个解决方案有所帮助! 😃

© www.soinside.com 2019 - 2024. All rights reserved.