CardView的背景将响应android:state_selected和android:state_pressed

时间:2015-11-17 17:32:31

标签: android

我指的是https://stackoverflow.com/a/24475228/72437

的答案

建议的答案是使用Android中的drawable:?android:attr/selectableItemBackground

enter image description here

当我点击卡片项目时会发生这种情况。请注意,通过使用Android中的drawable,android:state_selected="true"(当setSelected(true)时)不会有任何颜色更改效果。

因此,我想使用我自己定义的drawable,以便

  1. 看起来更好。
  2. 能够处理android:state_selected="true"
  3. 这是我的代码

    statelist_item_background.xml

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

    selected_background.xml

    <shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android">
        <solid android:color="#ffffe1b3" />
        <stroke
            android:width="1px"
            android:color="#fff76d3c" />
    </shape>
    

    card_row.xml

    <!-- A CardView that contains a TextView -->
    <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:clickable="true"
        android:foreground="@drawable/statelist_item_background"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <LinearLayout
            android:padding="5dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <TextView
                android:id="@+id/txt_label_item"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceLarge"
                tools:text="Item Number One" />
    
            <TextView
                android:id="@+id/txt_date_time"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceMedium"
                tools:text="Item Number One" />
        </LinearLayout>
    </android.support.v7.widget.CardView>
    

    当我长按卡片项目并执行childView.setSelected(true);时,这是我的结果。

    enter image description here

    我的所有卡内容(TextView s)都被屏蔽了。我怎么能避免这样的?

    关于使用android:background

    的一些注意事项

    注意,当您android:background="@drawable/statelist_item_background"使用CardView时,不会发生任何事情。

    但是,如果您将android:background="@drawable/statelist_item_background"CardView的{​​{1}},一起使用,您将获得以下不完美的结果

    enter image description here

    突出显示的颜色不包括整张卡

    更新

    似乎这是LinearLayout的限制 - https://code.google.com/p/android/issues/detail?id=78198使用“前景”作为解决方法不是一个选项,因为它涵盖了卡内容。

6 个答案:

答案 0 :(得分:2)

经过一段时间的实验,我几乎可以得出结论,这是当前CardView的限制 - https://code.google.com/p/android/issues/detail?id=78198

请勿使用CardView的前台解决方法。虽然它被广泛提出,但它不起作用!

我的建议是,如果您需要自定义选择器,请避免使用CardView。替换它LayerDrawable。这就是我所做的。

card.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <solid android:color="@android:color/transparent" />
            <stroke
                android:width="1dp"
                android:color="#ffededed" />
            <corners android:radius="2dp" />
        </shape>
    </item>

    <item>
        <shape>
            <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <stroke
                android:width="1dp"
                android:color="#ffe8e8e8" />
            <corners android:radius="2dp" />
        </shape>
    </item>

    <item>
        <shape>
            <padding android:top="0dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <stroke
                android:width="1dp"
                android:color="#ffe1e1e1" />
            <corners android:radius="2dp" />
        </shape>
    </item>

    <item>
        <shape>
            <padding android:top="0dp" android:right="0dp" android:bottom="1dp" android:left="0dp" />
            <stroke
                android:width="1dp"
                android:color="#ffdbdbdb" />
            <corners android:radius="2dp" />
        </shape>
    </item>

    <item>
        <shape>
            <padding android:top="0dp" android:right="0dp" android:bottom="1dp" android:left="0dp" />
            <stroke
                android:width="1dp"
                android:color="#ffd5d5d5" />
            <corners android:radius="2dp" />
        </shape>
    </item>

    <!--
    <item>
        <shape>
            <padding android:top="0dp" android:right="0dp" android:bottom="1dp" android:left="0dp" />
            <stroke
                android:width="1dp"
                android:color="#ffcfcfcf" />
            <corners android:radius="2dp" />
        </shape>
    </item>
    -->

    <item>
        <shape >
            <solid android:color="#ffffffff" />
            <corners android:radius="2dp" />
        </shape>
    </item>
</layer-list>

card_selected.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <stroke
                android:width="1dp"
                android:color="#ffededed" />
            <corners android:radius="2dp" />
        </shape>
    </item>

    <item>
        <shape>
            <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <stroke
                android:width="1dp"
                android:color="#ffe8e8e8" />
            <corners android:radius="2dp" />
        </shape>
    </item>

    <item>
        <shape>
            <padding android:top="0dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <stroke
                android:width="1dp"
                android:color="#ffe1e1e1" />
            <corners android:radius="2dp" />
        </shape>
    </item>

    <item>
        <shape>
            <padding android:top="0dp" android:right="0dp" android:bottom="1dp" android:left="0dp" />
            <stroke
                android:width="1dp"
                android:color="#ffdbdbdb" />
            <corners android:radius="2dp" />
        </shape>
    </item>

    <item>
        <shape>
            <padding android:top="0dp" android:right="0dp" android:bottom="1dp" android:left="0dp" />
            <stroke
                android:width="1dp"
                android:color="#ffd5d5d5" />
            <corners android:radius="2dp" />
        </shape>
    </item>

    <!--
    <item>
        <shape>
            <padding android:top="0dp" android:right="0dp" android:bottom="1dp" android:left="0dp" />
            <stroke
                android:width="1dp"
                android:color="#ffcfcfcf" />
            <corners android:radius="2dp" />
        </shape>
    </item>
    -->

    <item>
        <shape>
            <solid android:color="#ffffe1b3" />
            <stroke
                android:width="1px"
                android:color="#fff76d3c" />
            <corners android:radius="2dp" />
        </shape>
    </item>
</layer-list>

statelist_item_background.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:exitFadeDuration="@android:integer/config_mediumAnimTime">

    <item android:state_pressed="true" android:drawable="@drawable/card_selected" />     <!-- pressed -->
    <item android:state_selected="true" android:drawable="@drawable/card_selected" />     <!-- pressed -->

    <item android:drawable="@drawable/card" />

</selector>

layout.xml

<!-- A CardView that contains a TextView -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:padding="10dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginTop="5dp"
    android:layout_marginBottom="5dp"
    android:background="@drawable/statelist_item_background"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true" >

    <TextView
        android:id="@+id/txt_label_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        tools:text="Item Number One" />

    <TextView
        android:id="@+id/txt_date_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        tools:text="Item Number One" />
</LinearLayout>

你会得到相当不错的结果。

enter image description here

答案 1 :(得分:0)

我相信你误解了你提到的问题。问题是如何获得涟漪效应:

enter link description here

我认为您只是在寻找点击反馈? 如果是这样,请尝试设置背景drawable:

  android:background="@drawable/statelist_item_background"

编辑:

在你的背景色xml上,你需要给它一个alpha。它被绘制在前面,所以给它一个.1f的alpha值,然后看看它是如何看起来那样的。 尝试使用颜色50F76D3C然后像前一样使用它在前景中。

答案 2 :(得分:0)

  

我的所有卡片内容(TextViews)都被屏蔽了。我怎么能避免这样的?

您可以通过一些色彩理论知识轻松解决您的被阻止问题。您可以使用具有更高透明度的桃色调变体,而不是使用给定的桃色。

Android xxyyyyyy中的颜色代码方案

xx是你的透明度级别,y是你的颜色。

xx max value是:ff //这是完全可见的

xx min值为:00 //这是完全不可见的

因此,通过在色轮上玩游戏,您可以获得正确的效果,并且视图需要适当的透明度。

答案 3 :(得分:0)

对于不覆盖整个卡片问题的背景,这是由于cornerRadius绘图限制。有两种解决方案:

  1. 禁用您的卡的圆角将解决问题。 app:cardCornerRadius="0dp"

  2. 您可以保留cardCornerRadius,但需要设置app:cardPreventCornerOverlap="false"

答案 4 :(得分:0)

我刚刚尝试过MaterialCardView,它的工作原理是:

<com.google.android.material.card.MaterialCardView
    android:id="@+id/material_card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/activity_vertical_margin"
    app:cardCornerRadius="4dp"
    app:cardBackgroundColor="@color/selector_background_color"
    app:strokeWidth="2dp">

selector_background_color.xml

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

在活动/片段中:

material_card_view.setOnClickListener {
        it.isActivated = !it.isActivated
}

对于strokeColor,您不能使用选择器。如果要根据选择器状态更改笔触颜色,则必须以编程方式进行操作。

state_activated示例:

val colorStateList: ColorStateList = 
ResourcesCompat.getColorStateList(resources, 
R.color.selector_stroke_color, null)!!
val colorForState =colorStateList.getColorForState(intArrayOf(android.R.attr.state_activated), colorStateList.defaultColor)
material_card_view.strokeColor = colorForState

答案 5 :(得分:0)

MaterialCardView 具有涟漪效应,与 CardView 不同,不需要自定义背景可绘制。 这为我的用例处理了 android:state_selectedandroid:state_pressed