83

デイ/ナイト モード機能が組み込まれた Android を使用していますが、アプリにオプションを追加したいと考えています。AppCompatDelegate.MODE_NIGHT_AUTO

私のアプリでは特定のものをプログラムで色付けする必要があり、アプリが夜間モードと昼間モードのどちらであるかを確認する方法がわからないため、問題が発生しています。それがなければ、適切な色を選択するためのフラグを設定できません。

呼び出すAppCompatDelegate.getDefaultNightMode()と、役に立たない AppCompatDelegate.MODE_NIGHT_AUTO が返されます。

他に何も教えてくれませんが、何かがあるに違いありませんか?

4

8 に答える 8

138
int nightModeFlags =
    getContext().getResources().getConfiguration().uiMode &
    Configuration.UI_MODE_NIGHT_MASK;
switch (nightModeFlags) {
    case Configuration.UI_MODE_NIGHT_YES:
         doStuff();
         break;

    case Configuration.UI_MODE_NIGHT_NO:
         doStuff();
         break;

    case Configuration.UI_MODE_NIGHT_UNDEFINED:
         doStuff();
         break;
}
于 2017-05-24T23:49:33.753 に答える
10

Java のビット単位演算子 (@ephemient の回答で使用されている) は kotlin では異なるため、初心者にとってコードを簡単に変換できない可能性があります。誰かがそれを必要とする場合に備えて、kotlin バージョンを次に示します。

    private fun isUsingNightModeResources(): Boolean {
        return when (resources.configuration.uiMode and 
Configuration.UI_MODE_NIGHT_MASK) {
            Configuration.UI_MODE_NIGHT_YES -> true
            Configuration.UI_MODE_NIGHT_NO -> false
            Configuration.UI_MODE_NIGHT_UNDEFINED -> false
            else -> false
    }
}
于 2019-07-25T03:46:36.870 に答える
1

たぶん、あなたがダークモードを持っているかどうかを実際に教えてくれるプロパティですか?

val Context.isDarkMode
    get() = if (getDefaultNightMode() == MODE_NIGHT_FOLLOW_SYSTEM)
        resources.configuration.uiMode and UI_MODE_NIGHT_MASK == UI_MODE_NIGHT_YES
    else getDefaultNightMode() == MODE_NIGHT_YES
于 2021-09-04T05:50:47.063 に答える
1

Xamarin.Android の場合

if (Build.VERSION.SdkInt >= BuildVersionCodes.Froyo)
{
    var uiModeFlags = Application.Context.Resources.Configuration.UiMode & UiMode.NightMask;
    switch (uiModeFlags)
    {
        case UiMode.NightYes:
            // dark mode
            break;
        case UiMode.NightNo:
            // default mode
            break;
        default:
            // default mode
            break;
    }
}
else
{
// default mode
}
于 2020-09-02T13:28:08.833 に答える
0

すべての回答コードで現在のテーマを取得しようとすると、UI テストで問題が発生しました。毎回同じ値を返します。

したがって、アプリケーション クラスで静的変数を作成し、UI テストのテーマを取得してそれをスローします。

@Theme
fun Context.getAppTheme(): Int? {
    val theme = when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
        Configuration.UI_MODE_NIGHT_NO -> Theme.LIGHT
        Configuration.UI_MODE_NIGHT_YES -> Theme.DARK
        else -> null
    }

    Application.theme = theme

    return theme
}

アプリケーション クラス:

companion object {
    @Theme
    @RunNone var theme: Int? = null
}

誰かの役に立つかもしれません!

于 2021-02-09T19:28:36.870 に答える