web-dev-qa-db-ja.com

Android-AppCompatDelegate.MODE_NIGHT_AUTOの使用時に夜間モードがオンになっているかどうかを検出する方法

Androidに組み込まれているデイナイトモード機能を使用しており、アプリに_AppCompatDelegate.MODE_NIGHT_AUTO_のオプションを追加したい

ただし、アプリで特定の色をプログラムで着色する必要があるため、問題があるのですが、アプリが夜間モードと昼間モードのどちらであるかを確認する方法を理解できません。それがないと、正しい色を選択するためのフラグを設定できません。

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

他に私に教えてくれるものは何も見当たらないが、何かあるに違いない?

30
Ben987654
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;
}
25
ephemient

あなたがkotlin開発者であれば、以下のコードを使用してダークモードを判断できます。

 val mode = context?.resources?.configuration?.uiMode?.and(Configuration.UI_MODE_NIGHT_MASK)
    when (mode) {
        Configuration.UI_MODE_NIGHT_YES -> {}
        Configuration.UI_MODE_NIGHT_NO -> {}
        Configuration.UI_MODE_NIGHT_UNDEFINED -> {}
    }

ダークテーマモードについての詳細

https://github.com/googlesamples/Android-DarkTheme/

2
Saurabh Khare

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
    }
}
0
Ali Nem

非常に簡単な解決策は、このような文字列リソースを追加することです。

res/values/strings.xml

_<string name="mode">Day</string>
_

res/values-night/strings.xml

_<string name="mode">Night</string>
_

そして、どこでそれをチェックする必要があるか:

_if (resources.getString(R.string.mode) == "Day") {
    // Do Day stuff here
} else {
    // Do night stuff here
}
_

ただし、アクティビティのライフサイクルのsuper.onCreate()の前にこれを呼び出すことはできません。常にonCreateの前に「日」を返します。

0
just_user