无法使用 window 经理屏幕更新 android 中的日夜模式
Unable to update the day and night modes in android with window manager screens
我使用 WindowManager 显示一种布局。如果我尝试更改夜间或白天模式,它不会产生影响。我的要求是,如果我单击 window 经理视图,它应该更改白天模式,反之亦然
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
var view = layoutInflater.inflate( R.layout.child_layout,null)
windowManager.addView(view,params)
我也有这个问题(使用 InputMethodService 膨胀键盘视图)。我不知道是否有更好的方法来修复它,但这是我的解决方法:
我在 DayNight 主题旁边创建了一个明确的白天主题和夜晚主题。我在每一个中使用了几乎相同的属性,但是子类化了不同的主题(对于默认主题,我的 parent
是 Theme.AppCompat.DayNight.DarkActionBar
,所以对于其他两个,我使用 Theme.AppCompat.Light.DarkActionBar
作为浅色主题和 Theme.AppCompat
为深色主题)。我还将 values-night
中的所有样式转换为主题可以设置的属性,因此我的 DayNight 主题的暗模式和亮模式与我创建的其他两个相同。
然后我根据我的主题设置使用 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
,仍会动态调整为系统的主题设置)。
由于我使用的是 InputMethodService
,因此我添加了此方法以在显示键盘视图时重新启动它:(根据我的测试,这不会对性能产生明显影响)
override fun onStartInputView(info: EditorInfo, restarting: Boolean) {
setInputView(onCreateInputView())
}
对于 WindowManager
,您可能希望以某种方式重新启动 window。 (如,销毁整个 window 并重新膨胀视图)。如果那不可行,我不知道该怎么做。我在这个问题上卡了两天。
我使用 WindowManager 显示一种布局。如果我尝试更改夜间或白天模式,它不会产生影响。我的要求是,如果我单击 window 经理视图,它应该更改白天模式,反之亦然
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
var view = layoutInflater.inflate( R.layout.child_layout,null)
windowManager.addView(view,params)
我也有这个问题(使用 InputMethodService 膨胀键盘视图)。我不知道是否有更好的方法来修复它,但这是我的解决方法:
我在 DayNight 主题旁边创建了一个明确的白天主题和夜晚主题。我在每一个中使用了几乎相同的属性,但是子类化了不同的主题(对于默认主题,我的 parent
是 Theme.AppCompat.DayNight.DarkActionBar
,所以对于其他两个,我使用 Theme.AppCompat.Light.DarkActionBar
作为浅色主题和 Theme.AppCompat
为深色主题)。我还将 values-night
中的所有样式转换为主题可以设置的属性,因此我的 DayNight 主题的暗模式和亮模式与我创建的其他两个相同。
然后我根据我的主题设置使用 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
,仍会动态调整为系统的主题设置)。
由于我使用的是 InputMethodService
,因此我添加了此方法以在显示键盘视图时重新启动它:(根据我的测试,这不会对性能产生明显影响)
override fun onStartInputView(info: EditorInfo, restarting: Boolean) {
setInputView(onCreateInputView())
}
对于 WindowManager
,您可能希望以某种方式重新启动 window。 (如,销毁整个 window 并重新膨胀视图)。如果那不可行,我不知道该怎么做。我在这个问题上卡了两天。