onConfigurationChanged для просмотра в WindowManager не работает надежно - PullRequest
0 голосов
/ 22 октября 2018

Я добавляю 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
}

1 Ответ

0 голосов
/ 24 октября 2018

Это может быть вызвано тем, что просмотр измеряется, когда поворот экрана еще не завершен.Попробуйте установить время ожидания.

clearTimeout(t)
t = setTimeout(function(){/*do your stuff here*/},200);

здесь t - глобальная переменная - to clearTimeout, если экран поворачивается до измерения размера экрана.Попробуйте поиграть со временем в миллисекундах (в моем коде 200), чтобы оптимизировать для желаемого поведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...