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:
- 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 (
)

Lichtmodus aktiviert (
)
(Achten Sie nicht auf die Sache mit der isAppearanceLightStatusBar, ich werde das später beheben)

Ich habe diesen Code zum Aktivieren von Edge-to-Edge in meiner BaseActivity.kt-Klasse
[code]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()
}
[/code]
Und dieser Code zum Aktivieren von Insets-Listenern zum Anwenden der korrekten Auffüllung auf die Ansichten
[code]override fun onActivityCreate(savedInstanceState: Bundle?) {
InsetsManager.applyBottomNavigationViewInsets(bind.bottomNavContainer)
InsetsManager.applyTutorialInsets(bind.tutorial, bind.promotionsTutorial)
}
[/code]
Hier ist der Code von InsetsManager.kt
[code]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
}
}
[/code]
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
[b]Was ich bereits überprüft habe:[/b]
[list]
[*][code]enableEdgeToEdge()[/code] wird vor setContentView() aufgerufen
[*]setOnApplyWindowInsetsListener wird in onCreate() nach setContentView() aufgerufen
[/list]
[b]Was ich bereits versucht habe:[/b]
[list]
[*]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)
[/list]
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]AppCompatDelegate.MODE_NIGHT_YES[/code])
[img]https://i.sstatic.net/fzOCTkT6.png[/img]
Lichtmodus aktiviert ([code]AppCompatDelegate.MODE_NIGHT_NO[/code])
(Achten Sie nicht auf die Sache mit der isAppearanceLightStatusBar, ich werde das später beheben)
[img]https://i.sstatic.net/60VdomBM.png[/img]