Как заставить применить темную тему на Android Studio? - PullRequest
2 голосов
/ 02 февраля 2020

Согласно документам , мне нужно только установить android:forceDarkAllowed=true в моем манифесте активности и наследовать тему от parent="Theme.MaterialComponents.DayNight". Я попробовал это, но это не сработало.

Вот мой файл манифеста:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:forceDarkAllowed="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

А вот мои styles.xml стили:

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

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

Я пытался чтобы получить название темы действия, используя следующий код:

resources.getResourceName(
    packageManager.getPackageInfo(packageName, PackageManager.GET_META_DATA)
        .applicationInfo.theme
)

Это показывает мне com.example.name:style/AppTheme, а не AppTheme.Dark. Как сделать так, чтобы при запуске приложения MainActivity автоматически настраивался на использование AppTheme.Dark (т.е. темный режим) с использованием android:forceDarkAllowed?

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Это не так, как темный режим работает на Android 10.

Во-первых, Android магическим образом не добавляет .Dark к вашей теме в любой момент, независимо от того, или нет пользователь включил темный режим. У вас есть android:theme="@style/AppTheme". Итак, Android будет использовать AppTheme все время, а ваш AppTheme.Dark не будет использоваться.

Во-вторых, идея DayNight заключается в том, что вы используете это в качестве базовой темы все время и Android будет переключаться между обычным и темным режимами в зависимости от запроса пользователя. Итак, если вы переключите AppTheme на расширение DayNight и избавитесь от AppTheme.Dark, вы будете соответствовать тому, что документация требует.

android:forceDarkAllowed для случаев где вы не можете использовать тему DayNight и хотите, чтобы Android попытался автоматически преобразовать ваш интерфейс в темную тему. Если вы хотите сохранить AppTheme расширение Light вместо DayNight, это может сработать (лично я не пробовал его с темой MaterialComponents). Но даже тогда, это будет только тогда, когда пользователь включил темный режим (например, нажал на плитку оттенка уведомления).

Например, в это пример приложения , я использую DayNight для моей темы:

<resources>

  <!-- Base application theme. -->
  <style name="AppTheme" parent="Theme.AppCompat.DayNight">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
  </style>

</resources>

У меня есть различные определения для этих цветов в res/values/ и res/values-night/. Я не использую forceDarkAllowed. И когда пользователь переключает ночной режим, мой пользовательский интерфейс переходит от:

DayNight normal

до:

DayNight dark mode

Как можно ли сделать так, чтобы при запуске приложения MainActivity автоматически настраивалась на использование AppTheme.Dark (т. е. темного режима), используя android: forceDarkAllowed?

Нет.

Если вам все время нужна темная тема, используйте обычную тему (не Light, не DayNight).

1 голос
/ 02 февраля 2020
  1. Если ваше приложение использует темную тему (например, Theme.Material), Force Dark будет НЕ . Аналогично, если тема вашего приложения унаследована от темы DayNight, Force Dark будет НЕ применяться из-за автоматического переключения темы c.
  2. Темная тема доступна в Android 10 (API уровень 29) и выше. Убедитесь, что уровень API вашего устройства равен 29 +, что ваш целевой SDK в gradle равен 29.
  3. Существует два способа применения темной темы:
    1. DayNight - настраиваемая тема - вы контролируете, как будет выглядеть тема темных / светлых
    2. Force dark - вы управляете темой светлых тем, и если пользователь выбирает темный режим, система преобразует ваши взгляды в темные темы во время выполнения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...