ContextCompat.getColor()はNightModeを無視します


9

TL、DR;

ContextCompat.getColor() 夜の色は使用しません(values-night/colors.xmlナイトモードが有効になっている場合)を。

ここに問題があります:

皆さんこんにちは、

Androidアプリにダークテーマを実装しているので、これを呼び出して有効にします。 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

私は色を設定しvalues/colors.xml、そこに暗いバージョンがありますvalues-night/colors.xmlます。色はnightModeに応じてよく変化しますが、

を使用するContextCompat.getColor(getApplicationContext(), R.id.myColor)と、通常の色(values/colors.xml)が使用され、夜の色(values-night/colors.xml)。

私ではbuild.gradle、これらを設定しました:

implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.2.0-beta01'

誰かが私が間違っていることを教えてもらえますか?

PS:私はすでに次の質問を見ました、そしてそれはこの問題に答えません/programming/57779661/contextcompat-getcolor-method-ignores-night-mode


1
再現できません。appcompat1.1.0とXMLの両方の色を使用しており、ContextCompat.getColor()ナイトモードを強制した後、有効な値を返します。コードスニペットで質問を詳しく説明できますか(夜間モードを変更したり、色を取得したりする場合)?
Pawel

1
おそらく無効なコンテキスト(ApplicationContextなど)をgetColorに渡しています。getColorを呼び出す方法を教えてください。
W0rmH0le

@ W0rmH0leはい、私はApplicationContextを渡していました。これを機能させるためにアクティビティを使用する必要があることを知りませんでした!あなたの回答を有効なものとしてマークできるように、これを公式の回答として提供していただけませんか?
Mathieu de Brito

@Pawelあなたのフィードバックをありがとう、それはそれが私のコードのバグであることを私が知るのに役立ちました:)
Mathieu de Brito

お役に立てて嬉しいです!私は同様の問題に直面しました...結局、私はあなたのようなアプリケーションコンテキストを使用していました
W0rmH0le

回答:


12

私はナイトモードで同様の問題に直面しました。一部の画面は問題ありませんでしたが、他の画面は通常のテーマを維持していました。最終的に、現在のアクティビティコンテキストの代わりにアプリケーションのコンテキストを使用して、いくつかのビューをインスタンス化していることがわかりました。何らかの理由で、アプリケーションのコンテキストはこの種の情報を追跡しません。

したがって、アプリケーションコンテキストではなくcurrentのアクティビティコンテキストを使用するようにコードを更新します。

他のユーザーのための参照用。避ける:

ContextCompat.getColor(getApplicationContext(), R.id.myColor)

そして使用:

// In a Activity
ContextCompat.getColor(this, R.id.myColor)

// In a View
ContextCompat.getColor(getContext(), R.id.myColor)

// In a Fragment (check against null because getColor can trigger a NPE
Context context = getContext()
if (context != null) {
    ContextCompat.getColor(context, R.id.myColor)
}

3
Application「生の」コンテキストであり、常にデフォルトのスタイルの値を参照し、構成を無視します。AppCompatActivity一方、は適切な構成を処理し、にリンクされていAppCompatDelegateます。
Pawel

@Pawelこの回答への非常に良い追加、ありがとう!
muetzenflo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.