Программно изменить фон Drawable, сохраняя угловой радиус - PullRequest
1 голос
/ 10 апреля 2020

survey_timeline_row. xml

<LinearLayout
    android:id="@+id/interviewTimelineIconLayout"
    android:layout_width="52dp"
    android:layout_height="52dp"
    android:layout_marginTop="20dp"
    android:background="@drawable/timeline_row_icon_layout_bg"
    android:gravity="center"
    android:orientation="horizontal"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <ImageView
        android:id="@+id/interviewTimelineRowIcon"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_gravity="center"
        android:adjustViewBounds="false"
        android:cropToPadding="false"
        android:padding="6dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</LinearLayout>

timeline_row_icon_layout_bg. xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <corners android:radius="@dimen/_50sdp" />

    <stroke android:width="1dp" android:color="@color/white" />

    <solid android:color="@color/ic_rescheduled"/> //need to add this programatically

</shape>

InterviewTimeline. java

iconBg = row.findViewById(R.id.interviewTimelineIconLayout);

iconBg.setBackgroundColor(getResources().getColor(R.color.ic_rescheduled)); //this is the wrong way to go about it

Я хочу использовать timeline_row_icon_layout_bg. xml в разных местах моего приложения, и каждый раз он должен иметь разный цвет фона. Если я использую метод iconBg.setBackgroundColor (), он игнорирует радиус и у меня квадратный цвет фона.

Ответы [ 3 ]

2 голосов
/ 13 апреля 2020

Поскольку вы просто используете форму для создания макета со скругленными углами и границей, первый вариант - обернуть LinearLayout в CardView, а затем применить к карте радиус угла, обводку и цвет фона.

В противном случае вы можете использовать MaterialShapeDrawable, включенные в библиотеку компонентов материала, для рисования пользовательских фигур .

Просто удалите из LinearLayout android:background:

<LinearLayout
    android:id="@+id/interviewTimelineIconLayout"
    android:layout_width=".."
    android:layout_height="..
    ..>

    <!-- ..... -->

</LinearLayout>

Тогда в вашем коде вы можете применить ShapeAppearanceModel. Что-то вроде:

        float radius = getResources().getDimension(R.dimen.corner_radius);

        LinearLayout linearLayout= findViewById(R.id.interviewTimelineIconLayout);
        ShapeAppearanceModel shapeAppearanceModel = new ShapeAppearanceModel()
            .toBuilder()
            .setAllCorners(CornerFamily.ROUNDED,radius)
            .build();

        MaterialShapeDrawable shapeDrawable = new MaterialShapeDrawable(shapeAppearanceModel);
        //Fill the LinearLayout with your color
        shapeDrawable.setFillColor(ContextCompat.getColorStateList(this,R.color.yourColor));
        //Stroke color and width
        shapeDrawable.setStrokeWidth(2.0f);
        shapeDrawable.setStrokeColor(...);

        ViewCompat.setBackground(linearLayout,shapeDrawable);

enter image description here

Таким образом, вы легко можете изменить и установить цвет фона и обводку.

1 голос
/ 10 апреля 2020

Скопируйте ваш файл "timeline_row_icon_layout_bg. xml" и переименуйте его в "timeline_row_icon_layout_bg_new. xml"


<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <corners android:radius="@dimen/_50sdp" />

    <stroke android:width="1dp" android:color="@color/white" />

    <solid android:color="@color/put_the_color_you_need" />

</shape>

И вы можете установить фон для макета:

iconBg.setBackgroundResource(R.drawable.timeline_row_icon_layout_bg_new);
0 голосов
/ 10 апреля 2020

установить фон LinearLayout программно.

val bgDrawable = resources.getDrawable(R.drawable.timeline_row_icon_layout_bg, null).apply{
    colorFilter = PorterDuffColorFilter(
            ResourcesCompat.getColor(resources, R.color.ic_rescheduled, null),
            PorterDuff.Mode.SRC_IN
        )

}

iconBg.background = bgDrawable

переместить нарисованную фигуру timeline_row_icon_layout_bg в папку ресурсов для рисования.

...