Я добавляю View
к WindowManager
и перезаписываю его onConfigurationChanged
следующим образом:
Просмотр кода
// onConfigurationChanged should be called after config change has finished
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
// also tried executing following in the `GlobalLayoutListener` without any difference
onConfigOrSystemUIChanged(newConfig)
}
fun onConfigOrSystemUIChanged(newConfig: Configuration?) {
val screen = getScreenSize(this)
// screen should hold current screen size
// but this sometimes contains the wrong size, the one from before the config change
L.d("[%s] Config changed (%s)", logBaseInfo, screen)
}
Сервисный код
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
val screen = getScreenSize(this)
L.d("Config changed in SERVICE: Screen: %s | newConfig: %s", screen, newConfig);
}
Проблема
Я вижу, что это работает примерно в 99% случаев.Я вращаю свое устройство, включаю, выключаю и так далее, и все работает нормально.Но время от времени я вижу, что однажды происходит сбой, а это означает, что мой взгляд читает неправильный размер экрана после поворота устройства.Есть идеи, почему?
Дополнительная информация - журналы
Я добавил несколько журналов в onConfigurationChanged
моего сервиса и в onConfigurationChanged
моего просмотра.У меня есть 5 представлений, добавленных к WindowManager
, и я вижу следующее:
[OverlayService:168 onConfigurationChanged]: Config changed in SERVICE: Screen: Point(2076, 1080) | newConfig: {0 1.0 themeSeq = 0 showBtnBg = 0 232mcc1mnc [de_AT] ldltr sw360dp w692dp h336dp 480dpi nrml long hdr land finger -keyb/v/h -nav/h appBounds=Rect(144, 0 - 2220, 1080) s.839 mkbd/h desktop/d ?dc}
[BaseMviOverlayView:115 onConfigOrSystemUIChanged]: [MviHandleView[Index: 24]] Config changed (Point(2076, 1080))
[BaseMviOverlayView:115 onConfigOrSystemUIChanged]: [MviHandleView[Index: 26]] Config changed (Point(2076, 1080))
[BaseMviOverlayView:115 onConfigOrSystemUIChanged]: [MviHandleView[Index: 52]] Config changed (Point(2076, 1080))
[BaseMviOverlayView:115 onConfigOrSystemUIChanged]: [MviHandleView[Index: 53]] Config changed (Point(2076, 1080))
=> [BaseMviOverlayView:115 onConfigOrSystemUIChanged]: [MviHandleView[Index: 65]] Config changed (Point(1080, 2076))
// ... here some time that wents by ...
[OverlayService:168 onConfigurationChanged]: Config changed in SERVICE: Screen: Point(1080, 2076) | newConfig: {0 1.0 themeSeq = 0 showBtnBg = 0 232mcc1mnc [de_AT] ldltr sw360dp w360dp h668dp 480dpi nrml long hdr port finger -keyb/v/h -nav/h appBounds=Rect(0, 0 - 1080, 2076) s.840 mkbd/h desktop/d ?dc}
[BaseMviOverlayView:115 onConfigOrSystemUIChanged]: [MviHandleView[Index: 26]] Config changed (Point(1080, 2076))
[BaseMviOverlayView:115 onConfigOrSystemUIChanged]: [MviHandleView[Index: 52]] Config changed (Point(1080, 2076))
[BaseMviOverlayView:115 onConfigOrSystemUIChanged]: [MviHandleView[Index: 53]] Config changed (Point(1080, 2076))
[BaseMviOverlayView:115 onConfigOrSystemUIChanged]: [MviHandleView[Index: 65]] Config changed (Point(1080, 2076))
[BaseMviOverlayView:115 onConfigOrSystemUIChanged]: [MviHandleView[Index: 24]] Config changed (Point(1080, 2076))
Здесь вы видите, что одно представление (помечено =>
в начале строки журнала,6-я строка) выводит неправильный размер экрана, и я не знаю, почему ...
Дополнительная информация - функции
fun getScreenSize(context: Context) {
val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
val outSize = Point()
wm.getDefaultDisplay().getSize(outSize)
return outSize
}