如何在自定义适配器中更改可绘制形状的背景颜色

4

我有一个自定义列表项中的按钮,我正在使用以下可绘制xml文件:

rounded_corner.xml


(注意:此处已翻译并保留了html标签)
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="120dp" android:layout_height="100dp">

    <stroke
        android:width="1dp"
        android:color="#FFFFFF" />

    <solid android:color="#002832" />

    <padding
        android:left="1dp"
        android:right="1dp"
        android:top="1dp" />

    <corners android:radius="5dp" />

</shape>

我之前在 drawable 中使用了 "#002832" 颜色。现在,我想要通过编程的方式改变 drawable 文件的颜色。我该怎么做?

请不要在没有理解问题的情况下标记为重复。

  1. 我已经查看了 @Ganesh Pokele SO 的链接,但那与我的问题完全不同。

  2. 我也查看了 @bizzard 提供的链接,但无法解决我的问题。


请查看Listview选择器的示例example - Ganesh Pokale
1
可能是Change drawable color programmatically的重复问题。 - blizzard
2
((GradientDrawable)someView.getBackground()).setColor(someColor); - Radhey
你解决了吗? - FabioR
2个回答

12

我在这篇文章中详细描述了您想要的内容,如果我理解您的问题正确,您可能希望查看它。

基本上,您应该创建一个具有不同颜色的另一个drawable,并通过yourView.setBackground(Drawable drawable)方法程序性地设置它:

another_round_corner.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="120dp" android:layout_height="100dp">

    <stroke
        android:width="1dp"
        android:color="#002832" />

    <solid android:color="#002832" />

    <padding
        android:left="1dp"
        android:right="1dp"
        android:top="1dp" />

    <corners android:radius="5dp" />

</shape>

每当需要时,将背景设置为这个可绘制对象。

编辑

由于原帖作者不想使用另一个可绘制对象,解决方案是像这样使用颜色过滤器:

button.getBackground().setColorFilter(Color.rgb(40, 50, 60), PorterDuff.Mode.SRC_ATOP);

您将获得所需的效果。PorterDuff.Mode.SRC_ATOP将在另一种颜色之上,不会混合它们,在背景上应用您想要的颜色。您需要在第一个参数中传递颜色(颜色将来自服务器)。如果它是十六进制的,请将其转换为RGB格式,例如,或进行任何所需的转换。

您始终可以通过编程方式更改可绘制对象的颜色,如果这样能起作用,请让我知道。

如果这对您有所帮助,请让我知道,并且如果确实有帮助,请点赞/选择为正确答案,谢谢。


可绘制对象的颜色可能是任何颜色,因此创建新的可绘制对象将无济于事。如果您有其他想法,请告诉我。 - Faisal Shaikh
但是创建另一个可绘制对象有什么好处呢? - FabioR
颜色将来自服务器,可能是任何颜色,那么创建另一个可绘制对象有什么意义呢?如果我错了,请纠正我。 - Faisal Shaikh
这是有意义的。好的,请检查我的更新答案,让我知道它是否适合您。 - FabioR
真棒!我很高兴知道。 - FabioR
它以我想要的方式解决了我的问题。谢谢! - Burak

0

解决方案

  1. 如果您想通过编程动态更改可绘制对象的颜色,请使用以下代码。

这是我的XML rectangle_border


<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <solid android:color="@color/gray"
    <corners android:topLeftRadius="5dp" android:bottomLeftRadius="5dp"
        android:topRightRadius="5dp" android:bottomRightRadius="5dp"/>
      <stroke android:color="@color/colorPrimary" android:width="1dp" />
</shape>

  • 这里我正在动态更改背景颜色

  •  Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, R.drawable.rectangle_border);
                Drawable wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
                DrawableCompat.setTint(wrappedDrawable, Color.parseColor(textcolor));
                //Here set the background in view
                holder.textrectangle_bgLL.setBackgroundResource(R.drawable.rectangle_border);
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接