Android установить Drawable фон в TextView из адаптера для API 21 - PullRequest
0 голосов
/ 16 марта 2020

Я сталкиваюсь с проблемой изменения цвета или рисования ресурса программно из адаптера утилизатора 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>

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Попробуйте это

holder.count.setBackground(mContext.getResources().getDrawable(R.drawable.shape_circle_accent));
            holder.count.setBackgroundTintList(mContext.getResources().getColorStateList(R.color.colorD));
0 голосов
/ 16 марта 2020

Попробуйте,

private void setBackgroundColor (TextView tv){
    GradientDrawable bgShape = (GradientDrawable) tv.getBackground();
    bgShape.mutate();
    bgShape.setColor(ContextCompat.getColor(mContext.getApplicationContext(), R.color.colorAccent));
}

Использование

if (Build.VERSION.SDK_INT < 23) {
    setBackgroundColor(holder.count);
} else {
    holder.count.setBackgroundTintList(mContext.getColorStateList(R.color.colorAccent));
}

Не знаю, правильно ли я понял вопрос. хаха ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...