Когда следует переопределить темный режим в жизненном цикле активности? - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь использовать в своем приложении передовые методы управления светлым и темным режимом на основе указаний здесь и здесь .

Исходя из этого, Я использую тему, унаследованную от DayNight:

В манифесте:

<application
    android:theme="@style/Theme.MyApp"
</application>

В темах. xml:

<style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorButtonNormal">@color/colorButtonNormal</item>
</style>

Это имеет желаемый эффект открытия Activity в светлой или темной теме, основанной на системных настройках устройства.

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

Но когда система находится в легком режиме, я обнаружил, что моя активность первоначально открывается со светлой темой (fla sh белого цвета), прежде чем я получаю возможность переключиться на темную тему. Я переключаюсь, как только могу, в жизненном цикле Активности:

@Override
protected void onCreate(Bundle savedInstanceState) {
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
    super.onCreate(savedInstanceState);
    // ...

Но даже тогда я получаю раздражающий "fla sh света", прежде чем Активность переключится на темноту.

Как мне избежать вспышки sh света?

1 Ответ

0 голосов
/ 19 февраля 2020

Я получил некоторые уроки этого проекта о том, как все делать правильно.

То, что они делают в приведенном выше примере приложения, - это указание одной темы в Манифесте, но, как ни странно, эта тема переопределяется в night варианте темы:

В src/main/res/values/themes.xml :

<style name="Base.MaterialGallery" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
    ... some base styling ...
</style>

<style name="Theme.MaterialGallery" parent="Base.MaterialGallery">
    ... styling specific to LIGHT theme ...
</style>

<style name="Theme.MaterialGallery.DayNight" parent="Theme.MaterialGallery" />

Последнее, что указано выше, установлено в Манифесте:

<application
    android:name=".MaterialGalleryApplication"
    android:allowBackup="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher"
    android:supportsRtl="true"
    android:theme="@style/Theme.MaterialGallery.DayNight"
    tools:ignore="GoogleAppIndexingWarning">

Как ни странно, тема DayNight переопределяется для темного режима в src/main/res/values-night/themes.xml:

<style name="Theme.MaterialGallery.DayNight" parent="Theme.MaterialGallery">
    ... styling specific to DARK theme (since we're in the NIGHT values-night/themes.xml ...
</style>

Указав тему DayNight в Манифесте, вы сразу получите правильную тему, когда начнется действие, без каких-либо проблем.

...