Сквозное соединение не работает при воссоздании активности или применении AppCompatDelegate.setDefaultNightMode()Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Сквозное соединение не работает при воссоздании активности или применении AppCompatDelegate.setDefaultNightMode()

Сообщение Anonymous »

У меня есть этот код для включения сквозной связи в моем классе BaseActivity.kt

Код: Выделить всё

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(Const.TAG_ACTIVITY, String.format("%s BaseActivity onCreate()", this.javaClass.simpleName))
enableEdgeToEdge()
initBinding()
onActivityCreate(savedInstanceState)
observeLiveData()
}
И этот код позволяет прослушивателям вставок применять правильное дополнение к представлениям

Код: Выделить всё

override fun onActivityCreate(savedInstanceState: Bundle?) {
InsetsManager.applyBottomNavigationViewInsets(bind.bottomNavContainer)
InsetsManager.applyTutorialInsets(bind.tutorial, bind.promotionsTutorial)
}
Вот код InsetsManager.kt

Код: Выделить всё

object InsetsManager {

fun applyBottomNavigationViewInsets(bottomContainerView: ViewGroup) {
ViewCompat.setOnApplyWindowInsetsListener(bottomContainerView) { v, windowInsets ->
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(insets.left, insets.top, insets.right, insets.bottom)

WindowInsetsCompat.CONSUMED
}
}

fun applyTutorialInsets(view: MainPageTutorialView, promotionsTutorial: PromotionsPageTutorialView) {
ViewCompat.setOnApplyWindowInsetsListener(view) { _, windowInsets ->
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())

view.insetsTop = insets.top.toFloat()
view.insetsLeft = insets.left.toFloat()
view.insetsRight = insets.right.toFloat()
view.insetsBottom = insets.bottom.toFloat()
promotionsTutorial.insetsTop = insets.top.toFloat()
promotionsTutorial.insetsBottom = insets.bottom.toFloat()

WindowInsetsCompat.CONSUMED
}
}
}
Все работает нормально, пока я не вызываю AppCompatDelegate.setDefaultNightMode(//независимо от того, какой режим), чтобы изменить тему например, от дня к ночи.
Затем, как и ожидалось, активность воссоздается и восстанавливается все ее состояние, включая фрагменты, но сквозное соединение больше не применяется, и setOnApplyInsetsListeners не вызывается
Что я уже проверил:
  • Код: Выделить всё

    enableEdgeToEdge()
    вызывается перед setContentView()
  • setOnApplyWindowInsetsListener, вызываемый внутри onCreate() после setContentView()
Что я уже пробовал:
  • Вызывается EnableEdgeToEdge() в onStart, onResume (не сработало)
  • Включил configChanges="uiMode" и вызвал EnableEdgeToEdge() внутри onConfigurationChanged() и вручную вызвал recreate() (не сработало)
  • У меня был launchMode="singleTop" в моем AndroidManifest.xml, попробовал его удалить (не сработало)
Эта ошибка воспроизводится мной на эмуляторе и некоторых устройствах Samsung. На моем личном Pixel 9 все работает нормально, как и ожидалось.
Вот несколько примеров.
Темный режим включен (

Код: Выделить всё

AppCompatDelegate.MODE_NIGHT_YES
)
Изображение
Светлый режим включен (

Код: Выделить всё

AppCompatDelegate.MODE_NIGHT_NO
)
(Не обращайте внимания на isAppearanceLightStatusBar, я исправлю это позже)
Изображение


Подробнее здесь: https://stackoverflow.com/questions/793 ... -setdefaul
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»