我从按钮背景中得到了颜色,并以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>
谁能告诉我如何解决此问题?
答案 0 :(得分:1)
您需要为GradientDrawable
,startColor
和endColor
提供至少两种颜色
使用以下代码可能会引发异常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_color
和startColor
都拥有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();