Прослушивание темной темы в области уведомлений включает переключение и получение уведомления об изменении

Я могу получить 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, на который уже есть принятый ответ, относится к этой документации. .


person mrahimygk    schedule 11.01.2020    source источник


Ответы (1)


Чтобы получить информацию об изменении uiMode, добавьте атрибут 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;
    }
}
person Sdghasemi    schedule 11.01.2020