我有一张卡视图,可以动态列出一组卡。我已经使用了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>
并在我的班级(Adapter.kt)
name = itemView.findViewById(R.id.name) as TextView
if(value==true)
{
name.isEnabled=false
}
但是我想禁用整个卡。请帮助
答案 0 :(得分:1)
将android:background="@drawable/selector"
添加到您的RelativeLayout
或LinearLayout
中。可以启用和禁用。
注意:-这与问题无关,但是如果您关注的话。对您有好处。
我们直接比较
if(booleanVariable)
,而不是像if(booleanVariable==true)
。
答案 1 :(得分:1)
您可以将色调设置为相对的布局,该布局是物品设计中卡片视图的直接子元素。您必须在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,第二个是背景。
现在在适配器中,您可以执行以下操作:
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将返回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
}
答案 2 :(得分:1)
尝试在所有视图中设置以下内容,
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都必须将已保存状态用于位置已禁用,并且在状态被禁用时不执行任务。