Android 如何在cardview上添加彩色边框?
我是Android新手,这是我在这里的第一个问题 我试图在cardview的开头添加一个彩色的垂直边框。如何在xml上实现它?我试着用空的textview添加它,但它把整个cardview本身搞砸了。例如,请查看下面发布的图片链接 活动\u main.xmlAndroid 如何在cardview上添加彩色边框?,android,xml,android-cardview,Android,Xml,Android Cardview,我是Android新手,这是我在这里的第一个问题 我试图在cardview的开头添加一个彩色的垂直边框。如何在xml上实现它?我试着用空的textview添加它,但它把整个cardview本身搞砸了。例如,请查看下面发布的图片链接 活动\u main.xml <android.support.v7.widget.CardView android:layout_width="fill_parent" android:layout_height="wrap_content"
<android.support.v7.widget.CardView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
card_view:contentPadding="16dp"
card_view:cardElevation="2dp"
card_view:cardCornerRadius="5dp">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
style="@style/Base.TextAppearance.AppCompat.Headline"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Title" />
<TextView
style="@style/Base.TextAppearance.AppCompat.Body1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Content here" />
</LinearLayout>
</android.support.v7.widget.CardView>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white_background"/>
<stroke android:width="2dp"
android:color="@color/red" />
<corners android:radius="20dip"/>
</shape>
非常感谢试着做:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
card_view:cardElevation="2dp"
card_view:cardCornerRadius="5dp">
<FrameLayout
android:background="#FF0000"
android:layout_width="4dp"
android:layout_height="match_parent"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:orientation="vertical">
<TextView
style="@style/Base.TextAppearance.AppCompat.Headline"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Title" />
<TextView
style="@style/Base.TextAppearance.AppCompat.Body1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Content here" />
</LinearLayout>
</android.support.v7.widget.CardView>
这将删除cardview中的填充,并添加带有颜色的FrameLayout。然后需要修复LinearLayout中的填充,然后修复其他字段的填充
更新
如果要保留卡角半径,请在drawable文件夹中创建card_edge.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid android:color="#F00" />
<size android:width="10dp"/>
<padding android:bottom="0dp" android:left="0dp" android:right="0dp" android:top="0dp"/>
<corners android:topLeftRadius="5dp" android:bottomLeftRadius="5dp"
android:topRightRadius="0.1dp" android:bottomRightRadius="0.1dp"/>
</shape>
在框架布局中,使用android:background=“@drawable/card_edge”我认为这个解决方案可能效率不高,但它可以达到目的,并增加了边框宽度的灵活性
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="40dp"
android:layout_gravity="center"
card_view:cardBackgroundColor="@color/some_color"
card_view:cardCornerRadius="20dp"
card_view:contentPadding="5dp"> <!-- Change it to customize the border width -->
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
card_view:cardCornerRadius="20dp"
card_view:contentPadding="5dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Add your UI elements -->
</RelativeLayout>
</android.support.v7.widget.CardView>
</android.support.v7.widget.CardView>
我想改进Amit提出的解决方案。我正在利用给定的资源,而不添加额外的
形状
或视图
。我给cardwiew
一个背景色,然后嵌套布局,白色叠加一些leftMargin
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
card_view:cardElevation="2dp"
card_view:cardBackgroundColor="@color/some_color"
card_view:cardCornerRadius="5dp">
<!-- The left margin decides the width of the border -->
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:layout_marginLeft="5dp"
android:background="#fff"
android:orientation="vertical">
<TextView
style="@style/Base.TextAppearance.AppCompat.Headline"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Title" />
<TextView
style="@style/Base.TextAppearance.AppCompat.Body1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Content here" />
</LinearLayout>
</android.support.v7.widget.CardView>
从材料设计更新开始,它支持
app:strokeColor
和app:strokeWidth
使用材质设计更新。将以下代码添加到build.gradle
(:app)
然后将
cardwiew
更改为materialcardwiew
我通过将两个cardwiew放在一个相对位置解决了这个问题。一个带有边框颜色的背景,另一个带有图像。(或您希望使用的任何东西)
请注意第二个CardView的顶部和起始位置添加的边距。在我的例子中,我决定使用2dp厚的边框
<android.support.v7.widget.CardView
android:id="@+id/user_thumb_rounded_background"
android:layout_width="36dp"
android:layout_height="36dp"
app:cardCornerRadius="18dp"
android:layout_marginEnd="6dp">
<ImageView
android:id="@+id/user_thumb_background"
android:background="@color/colorPrimaryDark"
android:layout_width="36dp"
android:layout_height="36dp" />
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
android:id="@+id/user_thumb_rounded"
android:layout_width="32dp"
android:layout_height="32dp"
app:cardCornerRadius="16dp"
android:layout_marginTop="2dp"
android:layout_marginStart="2dp"
android:layout_marginEnd="6dp">
<ImageView
android:id="@+id/user_thumb"
android:src="@drawable/default_profile"
android:layout_width="32dp"
android:layout_height="32dp" />
</android.support.v7.widget.CardView>
我的解决方案:
创建一个文件card\u view\u border.xml
<android.support.v7.widget.CardView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
card_view:contentPadding="16dp"
card_view:cardElevation="2dp"
card_view:cardCornerRadius="5dp">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
style="@style/Base.TextAppearance.AppCompat.Headline"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Title" />
<TextView
style="@style/Base.TextAppearance.AppCompat.Body1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Content here" />
</LinearLayout>
</android.support.v7.widget.CardView>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white_background"/>
<stroke android:width="2dp"
android:color="@color/red" />
<corners android:radius="20dip"/>
</shape>
cardwiew
扩展了FrameLayout,因此它支持前台
属性。使用前景
属性也可以轻松添加边框
布局如下:
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/link_card"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:foreground="@drawable/bg_roundrect_ripple_light_border"
app:cardCornerRadius="23dp"
app:cardElevation="0dp">
</androidx.cardview.widget.CardView>
bg_roundrect_ripple_light_border.xml
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/ripple_color_light">
<item>
<shape android:shape="rectangle">
<stroke
android:width="0.5dp"
android:color="#DDDDDD" />
<corners android:radius="23dp" />
</shape>
</item>
<item android:id="@android:id/mask">
<shape android:shape="rectangle">
<corners android:radius="23dp" />
<solid android:color="@color/background" />
</shape>
</item>
</ripple>
因为公认的答案要求您添加框架布局,这里介绍如何使用材料设计 如果尚未添加此项,请添加此项
implementation 'com.google.android.material:material:1.0.0'
现在将Cardview更改为MaterialCardView
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:cardCornerRadius="8dp"
app:cardElevation="2dp"
app:strokeWidth="1dp"
app:strokeColor="@color/black">
现在您需要将活动主题更改为theme.Material。如果你正在使用Theme.Appcompact,我会建议你在未来的项目中使用Theme.Material,以便在你的应用程序中有更好的材料设计
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
您需要在此处使用cardview吗?如果只是一个平面线性布局,并在你的回收器视图中添加一个项目装饰呢?我是Android的初学者,回收器视图对于我目前的技能来说有点高级。所以,我在这里使用的是cardview。@GeorgeForster更新为使用可绘制的背景来保留卡角(如果您仍想保留它们),但这对我不起作用。为什么框架布局的宽度为4 dp?此答案不应再标记为正确答案。正确的答案是昂明伦的答案。这是一个糟糕的解决方案。您正在添加视图层次级别,这会对性能造成损失。好主意,应该有可用的内部功能。这不是最有效的功能,但是我使用它还没有获得巨大的成功。找不到strokeColor。@PrimožKralj将cardView
更改为MaterialCardView
更改为cardView
更改为MaterialCardView
MaterialCardView
的全名是com.google.android.material.card.MaterialCardView
原因:java.lang.IllegalArgumentException:此组件上的样式要求您的应用程序主题为theme.MaterialComponents(或其后代)。这是一个优雅的解决方案!非常感谢。