在通知区域切换中侦听“黑暗主题”:主题发生更改时会收到通知

问题描述 投票:0回答:1

我可以通过调用UI_MODE_NIGHT_MASKresources.configuration.uiMode获得Configuration.UI_MODE_NIGHT_MASK

我需要收听此变量,并在接收新值时更改主题。

[我想我可以添加BroadcastReceiver,所以我可以执行getSystemService(A_CONSTANT_FROM_Context)并注册类似于ConnectivityManager.NetworkCallback的主题回调。但是我只能在文档中找到这些:在主题样式上扩展Theme.MaterialComponents.DayNight并使用values-night。问题dark them config已获得参考本文档的公认答案。

android android-theme android-10.0
1个回答
0
投票

要了解有关uiMode更改的信息,请在configChange中添加AndroidManifest.xml属性:

<application
    ...>
    <activity
        android:name=".YourActivity"
        ...
        android:configChanges="uiMode"/>
</application>

然后在您的活动中监听配置更改:

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) {
        // ui mode changed, 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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.