我使用RecyclerView
和一个简单的项目布局,由一个ConstraintLayout
组成,其中包含每个项目的文本元素。我想设置所有项目的背景,同时
- 单击时显示涟漪效果。
- 可视化视图何时处于活动状态。
- 能够设置颜色。(可选,如果真的必须的话(
最低 SDK 版本为 21,如果需要,允许提高。
我尝试过:
- 使用
@android:drawable/list_selector_background
是不可自定义的,也没有显示波纹。 - 使用
?selectableItemBackground
或?selectableItemBackgroundBorderless
不起作用,它会在运行时引发异常 (Failed to resolve attribute [...]
(。我确实在我的 gradle 脚本中放置了设计支持库,或者现在是com.google.android.material
包。预置android:attr/
会产生相同的错误。 - 使用
StateListDrawable
使用许多<ripple>
可绘制对象自己构建这一切似乎过于复杂,因为我不想重现上述功能的全部功能。
这个由@Cheticamp链接的答案与本文中的方法相结合,效果很好:
项目的布局如下所示:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/list_item_background_active_handler">
<include
layout="@layout/the_actual_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?selectableItemBackground" />
</FrameLayout>
list_item_background_active_handler
看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/listBackgroundActive" android:state_activated="true" />
<!-- default -->
<item android:drawable="@android:color/transparent" />
</selector>
这允许使用自定义颜色处理活动状态。只需在适配器中onBindViewHolder()
项的视图上调用isActivated(true)
。
涟漪效应的颜色可以用这种方法定制。