Я сталкиваюсь с проблемой изменения цвета или рисования ресурса программно из адаптера утилизатора holder
для API 21.
В приведенном ниже коде я изменяю ресурс рисования для API удара 23, но ничего не происходит. Я не пытался изменить цвет фона для рисования, но это не помогло.
Я бы предпочел изменить только оттенок фона, если это возможно для API 21, поэтому я могу избежать использования дополнительного рисования, но если это невозможно, я могу использовать one.
Примечание: Для стиля по умолчанию я установил фон TextView (отрисовка) в <style>
.
RecyclerView Adapter
@Override
public void onBindViewHolder(@NonNull StepHolder holder, int position) {
Step step = mStep.get(position);
holder.setCount(step.getCount());
holder.setDescription(step.getDescription());
if (position <= 2) {
if (Build.VERSION.SDK_INT < 23) {
// change drawable color property
holder.count.setBackgroundResource(R.drawable.shape_circle_accent);
} else {
holder.count.setBackgroundTintList(mContext.getColorStateList(R.color.colorAccent));
}
}
}
ViewHolder
public class StepHolder extends RecyclerView.ViewHolder {
public TextView count, description;
public View timeline;
public StepHolder(@NonNull View itemView) {
super(itemView);
this.count = itemView.findViewById(R.id.v_step_count);
this.description = itemView.findViewById(R.id.v_step_description);
}
public void setCount(String count) {
this.count.setText(count);
}
public void setDescription(String description) {
this.description.setText(description);
}
public void setTimeline(View timeline) {
this.timeline = timeline;
}
}
Модальный
public class Step {
private String count, description;
public Step(String count, String description) {
this.count = count;
this.description = description;
}
public String getCount() {
return count;
}
public String getDescription() {
return description;
}
@Override
public String toString() {
return "Step{" +
"count='" + count + '\'' +
", description='" + description + '\'' +
'}';
}
}
Просмотр
<TextView
android:id="@+id/v_step_count"
style="@style/StepsCounterTheme"
android:layout_marginStart="@dimen/app_space"
android:layout_marginEnd="@dimen/app_space"
android:text="@string/_1"
app:layout_constraintBottom_toTopOf="@+id/v_step_timeline_path"
app:layout_constraintEnd_toStartOf="@+id/v_step_description"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="spread_inside"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="spread" />
Drawable
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/colorWhite" />
</shape>
Стиль
Здесь я понял, что проблема со стилем. Значит, если я установлю стиль backgroundTint
, код для API <23 не повлияет. Однажды я попытался удалить <code>backgroundTint из стиля. Код работает.
<!-- steps to prepare timeline counter theme -->
<style name="StepsCounterTheme" parent="TextAppearance.MaterialComponents.Body1">
<item name="android:layout_width">@dimen/app_space_ot</item>
<item name="android:layout_height">@dimen/app_space_ot</item>
<item name="android:background">@drawable/shape_circle</item>
<item name="android:backgroundTint">@color/colorPrimary</item> <!-- this one -->
<item name="android:textColor">@color/colorWhite</item>
<item name="android:gravity">center</item>
</style>
Вопрос
Так что теперь мне интересно, как установить стиль по умолчанию backgroundTint
в стиле? Нужно ли создавать версию, указанную в стиле c? Позволит ли это переопределение в Java для API <23? </p>