在选择器的帮助下尝试对
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 的代码,您会发现它没有实现 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 不允许多行文本。 但看到你的用例,我想你应该去芯片实现。无论如何希望这个解决方案有所帮助! 😃