我指的是https://stackoverflow.com/a/24475228/72437
的答案建议的答案是使用Android中的drawable:?android:attr/selectableItemBackground
当我点击卡片项目时会发生这种情况。请注意,通过使用Android中的drawable,android:state_selected="true"
(当setSelected(true)
时)不会有任何颜色更改效果。
因此,我想使用我自己定义的drawable,以便
android:state_selected="true"
。这是我的代码
<?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>
<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>
<!-- 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);
时,这是我的结果。
我的所有卡内容(TextView
s)都被屏蔽了。我怎么能避免这样的?
注意,当您android:background="@drawable/statelist_item_background"
使用CardView
时,不会发生任何事情。
但是,如果您将android:background="@drawable/statelist_item_background"
与CardView
的{{1}},一起使用,您将获得以下不完美的结果。
突出显示的颜色不包括整张卡。
似乎这是LinearLayout
的限制 - https://code.google.com/p/android/issues/detail?id=78198使用“前景”作为解决方法不是一个选项,因为它涵盖了卡内容。
答案 0 :(得分:2)
经过一段时间的实验,我几乎可以得出结论,这是当前CardView
的限制 - https://code.google.com/p/android/issues/detail?id=78198
请勿使用CardView
的前台解决方法。虽然它被广泛提出,但它不起作用!
我的建议是,如果您需要自定义选择器,请避免使用CardView
。替换它LayerDrawable
。这就是我所做的。
<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>
<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>
<?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>
<!-- 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>
你会得到相当不错的结果。
答案 1 :(得分:0)
我相信你误解了你提到的问题。问题是如何获得涟漪效应:
我认为您只是在寻找点击反馈? 如果是这样,请尝试设置背景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绘图限制。有两种解决方案:
禁用您的卡的圆角将解决问题。 app:cardCornerRadius="0dp"
您可以保留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_selected
和 android:state_pressed
。