Прослушивание «Темной темы» в области уведомлений переключает и уведомляет об изменении - PullRequest
0 голосов
/ 11 января 2020

Я могу получить UI_MODE_NIGHT_MASK, позвонив resources.configuration.uiMode и Configuration.UI_MODE_NIGHT_MASK.

Мне нужно прослушать эту переменную и изменить мою тему при получении нового значения.

Я думаю, я мог бы добавить BroadcastReceiver, чтобы я мог сделать getSystemService(A_CONSTANT_FROM_Context) и зарегистрировать обратный вызов темы, подобный ConnectivityManager.NetworkCallback. Но я нашел это только в документах: расширение Theme.MaterialComponents.DayNight на стили моей темы и наличие values-night. Вопрос dark them config , на который уже есть принятый ответ со ссылкой на эту документацию.

1 Ответ

1 голос
/ 11 января 2020

Чтобы получить информацию об атрибуте uiMode change add configChanges в вашем 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) {
        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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...