Невозможно обновить дневной и ночной режимы в Android с помощью экранов оконного менеджера

#android #android-layout #android-windowmanager

#Android #android-макет #android-windowmanager

Вопрос:

с помощью WindowManager я показываю один макет. Если я попытаюсь изменить ночной или дневной режим, это не сработает. Мое требование заключается в том, что если я нажму на просмотр диспетчера окон, он должен изменить дневной режим и наоборот

  AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
 var view = layoutInflater.inflate( R.layout.child_layout,null)
 windowManager.addView(view,params)
 

Ответ №1:

У меня тоже была эта проблема (с InputMethodService, раздувающим вид клавиатуры). Я не знаю, есть ли лучший способ исправить это, но это был мой обходной путь:

Я создал явную тему дня и ночную тему вместе с темой DayNight. Я использовал почти одни и те же атрибуты в каждом из них, но подклассы разных тем (для темы по умолчанию моей parent была Theme.AppCompat.DayNight.DarkActionBar , поэтому для двух других я использовал Theme.AppCompat.Light.DarkActionBar для светлой темы и Theme.AppCompat для темной темы). Я также перевел все стили values-night в атрибуты, которые могут быть установлены темой, так что темный и светлый режимы моей темы DayNight были идентичны двум другим, которые я создал.

Затем я использовал a ContextThemeWrapper с темой в соответствии с моей настройкой темы, чтобы увеличить представление:

 val themeSetting = getStringPref(R.string.themeSettingKey)
val themeId = if (themeSetting == "MODE_NIGHT_NO") {
    R.style.AppThemeLight
} else if (themeSetting == "MODE_NIGHT_YES") {
    R.style.AppThemeDark
} else {  // MODE_NIGHT_FOLLOW_SYSTEM
    R.style.AppTheme
}
val wrapper = ContextThemeWrapper(context, themeId)
LayoutInflater.from(wrapper).inflate(...)
 

К сожалению, это означает, что тема устанавливается только при увеличении макета. Если настройка темы каким-то образом изменится, когда представление все еще открыто, тема не будет обновляться. (Если параметр MODE_NIGHT_FOLLOW_SYSTEM установлен, он все равно будет динамически настраиваться в соответствии с настройками темы системы).

Поскольку я использую an InputMethodService , я добавил этот метод для перезапуска представления клавиатуры всякий раз, когда оно отображается: (это не оказывает заметного влияния на производительность в моем тестировании)

 override fun onStartInputView(info: EditorInfo, restarting: Boolean) {
    setInputView(onCreateInputView())
}
 

С помощью a WindowManager вы, вероятно, захотите каким-то образом перезапустить окно. (Например, уничтожить все окно и повторно увеличить представление). Если это невозможно, я понятия не имею, что делать. Я застрял в этой проблеме на два дня.