如何通过第一次单击更改 CardView 的边框颜色并在第二次单击时再次变回以前的颜色 Android?

How to change the border color of CardView by first clicking and again change back to previous color on Second click Android?

如何使用选择器而不是更改背景来做到这一点?

if(isSelected) {
                binding.cvStainMaster.setBcackgroundResource(R.drawable.boarder_blue_corner);
                binding.btnStart.setBackgroundResource(R.drawable.bg_button_primary);
                isSelected = false;
            }else{
                binding.cvStainMaster.setBackgroundColor(Color.WHITE);
                binding.btnStart.setBackgroundResource(R.drawable.button_background_with_corner);
                isSelected = true;
            }

我已经通过更改背景完成了。但我希望它使用选择器

使用 androidx.cardview.widget.CardView 没有任何 属性 来改变 border/stroke 颜色,但是你可以使用 Material Design Library 中的 com.google.android.material.card.MaterialCardView 来实现它,这是androidx.cardview.widget.CardView (MaterialCardView extends CardView).

的子类

要在你的项目中添加 MaterialCardView 首先你必须添加指向最新版本的 Material 设计库的 grandle depedency,如:implementation 'com.google.android.material:material:1.5.0' 并且你的应用程序主题必须继承来自 Theme.MaterialComponents.*.

现在 MaterialCardView 您可以使用 app:strokeColor 属性设置指向颜色选择器的 stroke/border 颜色,以根据卡片 checked/unchecked 更改边框颜色state 和 app:strokeWidth 来设置笔划宽度。要激活 android:state_checked=true/false 状态,您还必须添加属性 android:checkable="true" 并且使用 app:checkedIconSize="0dp" 您可以删除默认的 checked-stated 图标。下面是一个用法示例:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <com.google.android.material.card.MaterialCardView
        android:id="@+id/materialCardView"
        android:layout_width="80dp"
        android:layout_height="100dp"
        android:checkable="true"
        app:cardBackgroundColor="@android:color/holo_green_light"
        app:cardForegroundColor="@android:color/transparent"
        app:checkedIconSize="0dp"
        app:cardCornerRadius="10dp"
        app:cardElevation="2dp"
        app:strokeWidth="4dp"
        app:strokeColor="@color/card_border_selector"/>

</RelativeLayout>

其中 @color/card_border_selectorres/color/card_border_selector.xml 中定义如下:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@android:color/holo_orange_light" android:state_checked="true"/>
    <item android:color="@android:color/holo_blue_light" android:state_checked="false"/>
</selector>

并且每次单击 MaterialCardView 时,您都必须使用 materialCardView.setChecked() 函数更改状态,如下例所示:

MaterialCardView materialCardView = findViewById(R.id.materialCardView);
materialCardView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        materialCardView.setChecked(!materialCardView.isChecked());
    }
});

android:state_checked=false的结果:

android:state_checked=true的结果: