android selectableItemBackground选择

时间:2016-02-10 09:58:20

标签: android android-selector

我希望在状态“激活”时更改视图的背景,并且我想保留?attr:selectableItemBackground的效果(波纹)。是否可以扩展或组合?attr:selectableItemBackground的选择器?

5 个答案:

答案 0 :(得分:11)

您可以使用LayerDrawable在您的激活状态颜色上绘制涟漪效果drawable(?attr:selectableItemBackground)。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <selector>
            <item android:state_activated="true">
                <color android:color="?attr/colorPrimary"/>
            </item>
            <item>
                <color android:color="@android:color/transparent"/>
            </item>
        </selector>
    </item>
    <item android:drawable="?attr/selectableItemBackground"/>
</layer-list>

修改 由于在API 21之前不可能在XML drawable中使用主题属性,因此将涟漪效果绘制为前景可绘制似乎更好,并且激活的颜色选择器可绘制为背景可绘制。

<View
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/yourView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:foreground="?attr/selectableItemBackground"
    android:background="@drawable/activated_color_selector">

res/drawable/activated_color_selector.xml包含:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true">
        <!-- Can't use the ?attr/colorPrimary before API 21 -->
        <color android:color="@color/primaryColor"/>
    </item>
    <item>
        <color android:color="@android:color/transparent"/>
    </item>
</selector>

答案 1 :(得分:0)

要在整个应用中更改涟漪颜色,您可以在应用主题

中进行广告宣传
<item name="colorControlHighlight">@color/ripple</item>

答案 2 :(得分:0)

不幸的是,我发现的唯一方法是在您的布局中拥有可以模拟所选状态的其他视图。像这样(也可以在棒棒糖之前使用):

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="?attr/listPreferredItemHeight"
    android:background="?attr/selectableItemBackground">

    <View
        android:id="@+id/item_selected"
        android:visibility="gone"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="?attr/colorControlHighlight"/>

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/item_title"
        android:layout_gravity="center_vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:textAppearance="?attr/textAppearanceListItem"/>

</FrameLayout>

然后,根据需要选中此特定项,在适配器中将item_selected的可见性设置为View.VISIBLEView.GONE

PS 显然,此解决方案使用 AppCompat 支持库,因此,为了使用它,应在build.gradle文件中添加以下行:

implementation 'com.android.support:appcompat-v7:28.0.0'

答案 3 :(得分:0)

我通过在运行时交换背景可绘制对象解决了这个问题。这段代码在RecyclerView.Adapter<MyViewHolder>的{​​{1}}中运行:

if (selected) {
    itemView.setBackgroundResource(R.drawable.selected_background);
} else {            
    TypedArray typedArray = context.obtainStyledAttributes(
          new int[]{android.R.attr.selectableItemBackground});
    itemView.setBackgroundResource(typedArray.getResourceId(0, 0));
    typedArray.recycle();
}

R.drawable.selected_background是指所选项目的背景:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/colorAccentLight" android:state_activated="true" />
    <item android:drawable="@android:color/transparent" />
</selector>

另一种解决方案是具有两种相同的物品类型,但背景不同,但这似乎是一个过大的选择。

答案 4 :(得分:0)

对于那些现在仅在2020年只关心API> = 21的人来说,这是一个更简单的解决方案:

<ripple
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?colorControlHighlight">
    <!-- ? the ripple's color (1) -->

    <!-- ? no `id` so our <shape> will be drawn and not just used as mask -->
    <item>
        <shape>
            <corners android:radius="9dp" />
            <solid android:color="@color/white" />
        </shape>
    </item>

</ripple>

(1)如果您没有在主题中覆盖colorControlHighlight,则涟漪的颜色将是Android的默认颜色。如果您覆盖它,但仍想使用Android的默认设置,请改用?android:colorControlHighlight