在通知区域切换中监听 "Dark Theme" 并收到更改通知
Listening on "Dark Theme" in notification area toggle and be notified of a change
我可以通过调用 resources.configuration.uiMode
和 Configuration.UI_MODE_NIGHT_MASK
获得 UI_MODE_NIGHT_MASK
。
我需要收听此变量并在收到新值时更改我的主题。
我想我可以添加一个 BroadcastReceiver
这样我就可以做一个 getSystemService(A_CONSTANT_FROM_Context)
并注册一个类似于 ConnectivityManager.NetworkCallback
的主题回调。但我只在文档中找到这些:在我的主题样式上扩展 Theme.MaterialComponents.DayNight
并具有 values-night
。已接受答案的问题 参考此文档。
要了解有关 uiMode
更改的信息,请在 AndroidManifest.xml
中添加 configChanges
属性:
<application
...>
<activity
android:name=".YourActivity"
...
android:configChanges="uiMode"/>
</application>
然后在您 activity 中监听配置更改:
public class YourActivity extends AppCompatActivity {
protected Configuration mPrevConfig;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
mPrevConfig = new Configuration(getResources().getConfiguration());
}
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
configurationChanged(newConfig);
mPrevConfig = new Configuration(newConfig);
}
protected void configurationChanged(Configuration newConfig) {
if (isNightConfigChanged(newConfig)) { // night mode has changed
recreate();
// do your thing
}
}
protected boolean isNightConfigChanged(Configuration newConfig) {
return (newConfig.diff(mPrevConfig) & ActivityInfo.CONFIG_UI_MODE) != 0 && isOnDarkMode(newConfig) != isOnDarkMode(mPrevConfig);
}
public static boolean isOnDarkMode(Configuration configuration) {
return (configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
}
}
我可以通过调用 resources.configuration.uiMode
和 Configuration.UI_MODE_NIGHT_MASK
获得 UI_MODE_NIGHT_MASK
。
我需要收听此变量并在收到新值时更改我的主题。
我想我可以添加一个 BroadcastReceiver
这样我就可以做一个 getSystemService(A_CONSTANT_FROM_Context)
并注册一个类似于 ConnectivityManager.NetworkCallback
的主题回调。但我只在文档中找到这些:在我的主题样式上扩展 Theme.MaterialComponents.DayNight
并具有 values-night
。已接受答案的问题
要了解有关 uiMode
更改的信息,请在 AndroidManifest.xml
中添加 configChanges
属性:
<application
...>
<activity
android:name=".YourActivity"
...
android:configChanges="uiMode"/>
</application>
然后在您 activity 中监听配置更改:
public class YourActivity extends AppCompatActivity {
protected Configuration mPrevConfig;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
mPrevConfig = new Configuration(getResources().getConfiguration());
}
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
configurationChanged(newConfig);
mPrevConfig = new Configuration(newConfig);
}
protected void configurationChanged(Configuration newConfig) {
if (isNightConfigChanged(newConfig)) { // night mode has changed
recreate();
// do your thing
}
}
protected boolean isNightConfigChanged(Configuration newConfig) {
return (newConfig.diff(mPrevConfig) & ActivityInfo.CONFIG_UI_MODE) != 0 && isOnDarkMode(newConfig) != isOnDarkMode(mPrevConfig);
}
public static boolean isOnDarkMode(Configuration configuration) {
return (configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
}
}