在适配器中设置GradientDrawable颜色

时间:2018-08-30 17:42:00

标签: android android-layout android-drawable

我从按钮背景中得到了颜色,并以String的形式存储在数据库中。稍后,我想在我的recyclerView适配器中使用此颜色String来设置TextView的颜色。下面是我的代码:

 @Override
public void onBindViewHolder(NoteListAdapter.NoteListHolder holder, int position) {
    current = data.get(position);
    final String text = current.getText();
    final String get_tag_text = current.getTag();
    final String get_tag_color = current.getTag_color();

    int[] colors = {Color.parseColor(get_tag_color)};
    GradientDrawable gd = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors);

    holder.note_text.setText(text);
    holder.tv_tag_text.setBackground(gd);
    holder.tv_tag_text.setText(get_tag_text);
}

我得到的错误是“ 未知颜色”。数据库中保存的颜色格式为(保存的颜色格式为android.graphics.drawable.GradientDrawable@d1790a4

下面是从按钮背景可绘制文件中获取颜色的代码,还有我的按钮xml代码

 color  = (GradientDrawable) tag_watchlist.getBackground().mutate();
tag_color= color.toString();

 <Button
        android:id="@+id/tag_watch"
        style="@style/tag_buttons"
        android:background="@drawable/watchlist_button"
        android:text="Watchlist" />

按钮背景的可绘制文件代码

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
android:padding="10dp">
<solid android:color="#a40ce1"/>
<corners android:radius="10dp"/>
</shape>

谁能告诉我如何解决此问题?

2 个答案:

答案 0 :(得分:1)

您需要为GradientDrawablestartColorendColor提供至少两种颜色

使用以下代码可能会引发异常java.lang.IllegalArgumentException: needs >= 2 number of colors

int[] colors = {Color.parseColor(get_tag_color)};
    GradientDrawable gd = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors);

以此更改代码:

int[] colors = {Color.parseColor(start_color), Color.parseColor(end_color)};
        GradientDrawable gd = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors);

如果您的get_tag_colorstartColor都拥有endColor,则进行相应替换,但这对GradientDrawable毫无帮助。

答案 1 :(得分:0)

  

修改后的答案

您将收到异常Caused by: java.lang.IllegalArgumentException: Unknown color,这意味着您没有将颜色以受支持的格式传递给方法Color.parseColor

确保以以下格式传递值

#RRGGBB
#AARRGGBB

这是有效的示例

Color.parseColor("#FF4081")

有关更多信息,请参见文档Color.parseColor

根据您的要求,您可以达到此API级别24以上。如果您使用的是当前的 minSdkVersion 24 ,请尝试以下

更改模型类以将颜色另存为Integer而不是String

GradientDrawable gradientDrawable = (GradientDrawable) tag_watchlist.getBackground().mutate();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    int color = gradientDrawable.getColor().getDefaultColor();
    Log.d("TAG","Color is :"+color);
    current.setTagColor(color); // where current is your model class
}

要从模型取回颜色

int color = current.getTagColor();