У меня есть круглый вид с настраиваемой рамкой, реализованный с использованием библиотеки CircularImageView и завышенной в RecyclerView
. До сих пор я помещал в него изображение, но теперь хочу заменить его одноцветным раундом и текстом на нем.Программно изменить сплошной цвет в существующей форме
Я создал следующую форму (shape_colored_circle.xml
):
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size
android:height="70dp"
android:width="70dp"/>
<solid
android:color="#00f"/>
</shape>
И добавил TextView
вместе с CircularImageView
в FrameLayout
:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/card"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<com.mikhaellopez.circularimageview.CircularImageView
android:id="@+id/card_thumbnail"
android:layout_width="70dp"
android:layout_height="70dp"
android:src="@drawable/icon"
app:civ_border="true"
app:civ_border_color="@color/border_color"
app:civ_border_width="2dp"
app:civ_shadow="true"
app:civ_shadow_color="@color/grey"
app:civ_shadow_radius="10"
android:contentDescription="@string/card_thumbnail"/>
<TextView
android:id="@+id/card_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/app_name"
android:textSize="18sp"
android:textStyle="bold"/>
</FrameLayout>
</LinearLayout>
Я знаю, что расположение кажется немного странным («почему верхняя часть LinearLayout
необходима?»), но без нее вид просто не отображается в RecyclerView
, тогда как этот макет (который берется из примера библиотеки) служит нашим потребностям.
В onBindViewHolder
я установить форму как CircularImageView
ресурса:
holder.thumbnail.setImageDrawable(activity.getResources().getDrawable(R.drawable.shape_colored_circle));
И, наконец, я вижу, что я ожидал. Проблема в том, что мой drawable имеет определенный цвет заранее. Поэтому я попытался создать форму программно:
GradientDrawable gd = new GradientDrawable();
gd.setShape(GradientDrawable.RECTANGLE);
gd.setColor(colors[position]); //Getting the color from a predefined array of colors
holder.thumbnail.setImageDrawable(gd);
Но вид просто превращается в черный прямоугольник. Я попробовал еще несколько решений для создания формы программно (все они очень похожи), но ничего не имею - я либо вижу черный прямоугольник, либо ничего вообще.
Я что-то не так? Есть ли другой способ создать форму или каким-то образом изменить существующую во время выполнения? Или, может быть, совершенно другой способ добиться требуемого поведения?
Спасибо!
Несколько лет назад я столкнулся с проблемой, когда фон моего drawable стал черным, когда я попытался установить цвет программно. Может быть, подобная проблема? http://stackoverflow.com/questions/24581900/android-button-background-xml-sometimes-loses-alpha-when-setting-color-filter – 0x5453
@ 0x5453 Я добавил 'gd.setAlpha()'. Для значения 255 это черный прямоугольник, для значения 0 он (очевидно) невидим. Вы считаете, что ваше решение имеет отношение к программно созданным чертежам? –