#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
вы, вероятно, захотите каким-то образом перезапустить окно. (Например, уничтожить все окно и повторно увеличить представление). Если это невозможно, я понятия не имею, что делать. Я застрял в этой проблеме на два дня.