如何在卡片视图中使卡片变灰?

How to greyout a card in a card view?

我有一个动态列出一组卡片的卡片视图。我为此使用了recyclerview。现在我想通过使卡片变灰或类似的东西来禁用卡片(基于价值)。这是包含卡片视图的布局

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

    <android.support.v7.widget.CardView
        android:layout_width="112dp"
        android:layout_height="140dp"
        android:layout_margin="10dp"
        android:clickable="true"
        android:focusable="true"
        android:scaleType="fitXY">

        <RelativeLayout
            android:layout_width="100dp"
            android:layout_height="150dp"
            android:padding="8dp">

            <ImageView
                android:id="@+id/appIcon"
                android:layout_width="match_parent"
                android:layout_height="62dp"
                android:padding="5dp"
                tools:ignore="VectorDrawableCompat" />

            <TextView
                android:id="@+id/name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/appIcon"
                android:layout_centerInParent="true"
                android:gravity="center"
                android:textAppearance="@style/Base.TextAppearance.AppCompat.Small"
                android:textColor="@drawable/selector"
                android:textSize="10dp"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/appVersion"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_alignParentEnd="true"
                android:layout_marginBottom="5dp"
                android:layout_marginEnd="1dp"
                android:text="version 0.0"
                android:textAppearance="@style/Base.TextAppearance.AppCompat.Small"
                android:textSize="8dp" />

        </RelativeLayout>

    </android.support.v7.widget.CardView>

</LinearLayout> 

我找到了一些相关查询并尝试使用选择器并将每个字段而不是整个卡片灰显。

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true" android:color="@color/colorAppName" />
    <item android:state_enabled="false" android:color="@color/colorPrimary" />

</selector>

在我的 class(Adapter.kt)

name = itemView.findViewById(R.id.name) as TextView
if(value==true)
{
  name.isEnabled=false
}

但是我想禁用整个卡。请帮忙

android:background="@drawable/selector" 添加到您的 RelativeLayoutLinearLayout。这将适用于启用和禁用。

注意:- 这与问题无关,但如果您关注。对你有好处。

We compare if(booleanVariable) directly instead of comparison like if(booleanVariable==true).

您可以为您的相关布局设置色调,该布局是项目设计中卡片视图的直接子项。您必须在 xml:

中执行此操作
 <android.support.v7.widget.CardView
        android:layout_width="112dp"
        android:layout_height="140dp"
        android:layout_margin="10dp"
        android:clickable="true"
        android:focusable="true"
        android:scaleType="fitXY">

        <RelativeLayout
            android:id="@+id/relParent"
            android:background="#fff"
            android:layout_width="100dp"
            android:layout_height="150dp"
            android:padding="8dp">
      ....>

我在RelativeLayout中添加了两个属性第一个是id,第二个是background。

现在在适配器中你可以这样做:

if(value==true)  
{
itemView.relParent.background.setColorFilter(Color.parseColor("#6F6F6F"),PorterDuff.Mode.SRC_IN)
        itemView.relParent.isEnabled=false
}
else
{
itemView.relParent.background.setColorFilter(Color.parseColor("#FFFFFF"),PorterDuff.Mode.SRC_IN)
        itemView.relParent.isEnabled=true
}

注意: 您必须将背景从 xml 设置为 RelativeLayout 否则 itemView.relParent.background 将 return null 并且您的应用程序将崩溃。

更新 你需要为你的卡片设置前景颜色,在这种情况下你可以这样做:

itemView.cardDashboard.foreground= ColorDrawable(Color.parseColor("#906F6F6F"))

这里的 cardDashboard 是您在项目设计中使用的卡片视图。

所以最终的代码会是这样的:

       if(value==true)  
        {
        itemView.cardDashboard.foreground= ColorDrawable(Color.parseColor("#906F6F6F"))     
   itemView.relParent.isEnabled=false
        }
        else
        {
        itemView.cardDashboard.foreground= ColorDrawable(Color.parseColor("#006F6F6F"))
                itemView.relParent.isEnabled=true
        }

尝试为所有视图设置以下内容,

android:duplicateParentState="true"

当此属性设置为 true 时,视图从其直接父级而非自身获取其可绘制状态(聚焦、按下等)。

然后动态禁用项目的布局(在特定位置),导致禁用其所有子视图。

注意:由于您的卡片视图处于回收器视图中,因此您需要维护适配器内不同位置的状态。

您可以像以前一样使用选择器维护背景状态。

我通过添加上述属性更改了您的布局:-

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">

<android.support.v7.widget.CardView
    android:layout_width="112dp"
    android:layout_height="140dp"
    android:layout_margin="10dp"

    android:id="@+id/cd"
    android:scaleType="fitXY">

    <RelativeLayout
        android:layout_width="100dp"
        android:layout_height="150dp"
        android:duplicateParentState="true"
        android:padding="8dp">

        <ImageView
            android:id="@+id/appIcon"
            android:layout_width="match_parent"
            android:layout_height="62dp"
            android:padding="5dp"
            android:duplicateParentState="true"
            tools:ignore="VectorDrawableCompat" />

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:duplicateParentState="true"

            android:text="@string/app_name"
            android:layout_below="@+id/appIcon"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:onClick="clickMe"
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Small"

            android:textSize="10dp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/appVersion"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:duplicateParentState="true"
            android:layout_alignParentBottom="true"
            android:layout_alignParentEnd="true"
            android:layout_marginBottom="5dp"
            android:layout_marginEnd="1dp"
            android:text="version 0.0"
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Small"
            android:textSize="8dp" />

    </RelativeLayout>

</android.support.v7.widget.CardView>

</LinearLayout>

并且已经通过禁用 cardview 状态进行了测试,其子视图也显示了颜色逐渐变为浅灰色的变化(没有使用视图选择器,因此它更改为默认禁用状态(针对 textview 进行了测试))。但是对于视图上的任何 clicklistner,您将必须使用已保存的状态来禁用位置,并且在禁用状态时不执行任务。