android:windowBackground不适用于RecyclerView

时间:2019-10-14 11:36:52

标签: android android-recyclerview android-theme

我的布局看起来像

<?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 :(得分:0)

根据您的使用习惯,您可以按照自己的样式创建自定义属性,例如:

<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>

将此文件添加到 values 文件夹下的 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,否则将出现异常。