Edge-to-Edge funktioniert nicht, wenn die Aktivität neu erstellt oder AppCompatDelegate.setDefaultNightMode() angewendet

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Edge-to-Edge funktioniert nicht, wenn die Aktivität neu erstellt oder AppCompatDelegate.setDefaultNightMode() angewendet

by Guest » 03 Jan 2025, 08:47

Ich habe diesen Code zum Aktivieren von Edge-to-Edge in meiner BaseActivity.kt-Klasse

Code: Select all

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()
}
Und dieser Code zum Aktivieren von Insets-Listenern zum Anwenden der korrekten Auffüllung auf die Ansichten

Code: Select all

override fun onActivityCreate(savedInstanceState: Bundle?) {
InsetsManager.applyBottomNavigationViewInsets(bind.bottomNavContainer)
InsetsManager.applyTutorialInsets(bind.tutorial, bind.promotionsTutorial)
}
Hier ist der Code von InsetsManager.kt

Code: Select all

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
}
}
Alles funktioniert gut, bis ich AppCompatDelegate.setDefaultNightMode(//egal welcher Modus) aufrufe, um das Thema zu ändern zum Beispiel von Tag zu Nacht.
Dann wird die Aktivität wie erwartet neu erstellt und ihr gesamter Status einschließlich Fragmenten wiederhergestellt, aber Edge-to-Edge wird nicht erneut angewendet und die setOnApplyInsetsListeners wurden nicht aufgerufen
Was ich bereits überprüft habe:
  • Code: Select all

    enableEdgeToEdge()
    wird vor setContentView() aufgerufen
  • setOnApplyWindowInsetsListener wird in onCreate() nach setContentView() aufgerufen
Was ich bereits versucht habe:
  • EnableEdgeToEdge() aufgerufen in onStart, onResume ( nicht work)
  • ConfigChanges="uiMode" aktiviert und enableEdgeToEdge() innerhalb von onConfigurationChanged() aufgerufen und recreate() manuell aufgerufen (hat nicht funktioniert)
  • Ich hatte einen launchMode="singleTop" in meiner AndroidManifest.xml und habe versucht, ihn zu entfernen (hat nicht funktioniert). Arbeit)
Dieser Fehler wurde von mir auf einem Emulator und einigen Samsung-Geräten reproduziert. Auf meinem persönlichen Pixel 9 funktioniert alles wie erwartet einwandfrei.
Hier sind einige Beispiele.
Dunkelmodus aktiviert (

Code: Select all

AppCompatDelegate.MODE_NIGHT_YES
)
Image
Lichtmodus aktiviert (

Code: Select all

AppCompatDelegate.MODE_NIGHT_NO
)
(Achten Sie nicht auf die Sache mit der isAppearanceLightStatusBar, ich werde das später beheben)
Image

Top