Цвет ночного режима не применяется к фону просмотра ресайклера

Я хочу реализовать ночной режим для своего приложения для Android, поэтому я использовал тему Theme.AppCompat.DayNight для реализации ночного режима. Но мне нужно настроить цвет панели инструментов и представления ресайклера в ночном режиме.

Для этого я объявил атрибут в файле attrs.xml и использую этот атрибут в качестве фона в recyclerview.

Вот файл attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="ds">
        <attr name="rv_color" format="color"/>
    </declare-styleable>
</resources>

Вот рециклер

 <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="?attr/rv_color"
        android:overScrollMode="never"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

Что касается стилей, я объявил styles.xml и styles.xml (night) для ночного режима.

Вот файл styles.xml

<style name="AppTheme" parent="Theme.AppCompat.DayNight">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@android:color/white</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="android:textColorPrimary">@color/colorPrimary</item>
    <item name="android:windowDisablePreview">false</item>
    <item name="rv_color">#FF0000</item>
</style>

Вот файл styles.xml (ночь)

<style name="AppTheme" parent="Theme.AppCompat.DayNight">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@android:color/white</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="android:textColorPrimary">@color/colorPrimary</item>
    <item name="android:windowDisablePreview">false</item>
    <item name="rv_color">#FFFF00</item>
</style>

В файле styles.xml я определил КРАСНЫЙ цвет для фона recyclerview и ЖЕЛТЫЙ цвет в файле ночного режима.

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

Вышеупомянутая строка присутствует в файле Activity, который находится в ночном режиме.

Но каждый раз, когда цвет представления ресайклера КРАСНЫЙ, то есть из файла styles.xml

Почему цвет styles.xml (night) не применяется к recyclerview.

Почему не работает? или любым другим способом сделать это?

3 ответа

У меня была такая же проблема (только у RecyclerView всегда был цвет, определенный в styles.xml (night), независимо от того, был ли активирован дневной или ночной режим), и я нашел решение в этой теме; единственное, что мне пришлось изменить, это не звонить

getApplicationContext() 

но использовать

MyActivity.this 

вместо этого при создании адаптера с

MyAdapter adapter = new MyAdapter(getApplicationContext(), arrayList);

в соответствующем Activity. Рабочий раствор:

MyAdapter adapter = new MyAdapter(MyActivity.this, arrayList);

Другой способ - создать в ваших ресурсах папку values-night, поместить в нее файл colors.xml и объявить цвет, например "rv_color":

<color name="rv_color">#ffff00</color>

и в обычных значениях /colors.xml:

<color name="rv_color">#ff0000</color>

Установите этот цвет для вашего recyclerview. Нет необходимости объявлять какой-либо настраиваемый атрибут.

Когда я впервые попытался реализовать предложение ondzilla, это не сработало. Однако, когда я установил для фона recyclerview другой цвет, который у меня уже был в файле colors.xml, фон теперь правильно переключается между днем ​​и ночью. Затем я снова переключил его на rv_color, и он работает правильно.

Не знаю, поможет ли это с вашим, но я очень рад, что вы задали этот вопрос, и что мой теперь работает.