Поддержка светлой и темной темы в Android Pie - PullRequest
0 голосов
/ 03 декабря 2018

В Android Pie добавлена ​​возможность переключения светлой / темной темы в меню «Настройки» -> «Дисплей» -> «Тема устройства».

Я хочу, чтобы мое приложение применило правильную тему в соответствии с темой устройства, установленной в устройстве.настройки.

В соответствии с руководством для Android Styles and Themes, для темного режима приложение должно использовать тему, которая расширяет Theme.AppCompat, а для светлого режима приложение должно использовать тему, которая расширяетTheme.AppCompat.Light.

Итак, я создал две темы в своем приложении:

<style name="AppTheme.Dark" parent="Theme.AppCompat">
  ...
</style>

<style name="AppTheme.Light" parent="Theme.AppCompat.Light">
  ...
</style>

Однако в AndroidManifest.xml, когда я объявляю приложение с тегом <application>, я могу указать только одну темув атрибуте android:theme:

<application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher"
    android:supportsRtl="true"
    android:theme="@style/AppTheme.Light"
    tools:replace="android:name">

Как объявить мое приложение в AndroidManifest.xml до динамически , выбрать @style/AppTheme.Light или @style/AppTheme.Dark в соответствии с темой устройства, установленной внастройки устройства?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Вы можете попробовать Theme.AppCompat.DayNight вместо определения двух тем.Его реализация в этом видео Стоимость пиксельного цвета .

Однако, когда я тестирую это на эмуляторе, переключение меню Настройки -> Дисплей -> Тема устройства не работает.Я должен переключить Параметры разработчика -> Ночной режим -> Всегда включен, и темная тема выбирается автоматически.

Поскольку у меня нет устройства Android Pie, я не уверен, что это ошибка эмулятора.

0 голосов
/ 03 декабря 2018

Если вы хотите изменить тему уже существующего занятия, вызовите функцию create () после setTheme ().

Примечание: не вызывайте функцию создания, если вы изменили тему в onCreate (), чтобы избежать бесконечного цикла,

  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Call setTheme before creation of any(!) View.
         setTheme(android.R.style.Theme_Dark);

        // ...
        setContentView(R.layout.main);
    }
...