Android: WindowBackground не работает с RecyclerView - PullRequest
1 голос
/ 14 октября 2019

Мой макет выглядит как

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize" />
    </com.google.android.material.appbar.AppBarLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

И я хотел бы применить тему динамически из моего фрагмента requireContext().setTheme(R.style.MyTheme)

К сожалению, android:windowBackground не устанавливает фон на RecyclerView.

    <style name="MyTheme" parent="@style/ThemeOverlay.AppCompat.Dark">
        <item name="android:windowBackground">@drawable/gradient_background</item>
    </style>

Кроме того, android:background не работает должным образом. Он устанавливает градиентный фон на каждую ячейку, а не на весь экран.

<style name="MyTheme" parent="@style/ThemeOverlay.AppCompat.Dark">
        <item name="android:background">@drawable/gradient_background</item>
    </style>

Установка android:background на RecyclerView работает

    <androidx.recyclerview.widget.RecyclerView
        android:background="@drawable/gradient_background"
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

, но я хотел бы добиться этого, передавединая тема. Возможно ли это?

1 Ответ

0 голосов
/ 14 октября 2019

В зависимости от того, что вы использовали, вы можете создать пользовательский атрибут в ваших стилях, например:

<style name="MyTheme" parent="@style/ThemeOverlay.AppCompat.Dark">
    <item name="recyclerViewBackground">@drawable/paywall_background</item>
</style>

<style name="MyTheme2" parent="@style/ThemeOverlay.AppCompat.Dark">
    <item name="recyclerViewBackground">@drawable/another_background</item>
</style>

Добавьте это в ваш attrs.xml файл в значения папка (если у вас ее нет, создайте):

<attr name="recyclerViewBackground" format="reference" />

И установите фон, используя это:

<com.airbnb.epoxy.EpoxyRecyclerView
    style="?theme"
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:background="?recyclerViewBackground"/>

Смена темы и воссоздание фрагмента теперь должно изменить фон RecyclerView. Также убедитесь, что каждая тема, которую вы будете использовать в этом представлении, содержит атрибут recyclerViewBackground, иначе вы получите исключение.

...