Hoe kan ik voorkomen dat de Nav Bar een zwarte balk achterlaat? (meeslepende modus)

Een app die de meeslepende modus gebruikt, laat een zwarte balk onder aan het scherm achter wanneer de app na een tijdje wordt teruggezet (activiteit wordt vernietigd).

Wat gebeurt er: (ik heb de optie voor ontwikkelaars ingeschakeld: “Bewaar activiteiten niet” om dit te reproduceren).

  1. Eerste keer starten van de app. Immersieve modus werkt zoals verwacht.

  2. Veeg omhoog om de ‘meeslepende plakkerige’ navigatiebalk weer te geven en gebruik de ‘Home’-knop om de app te verlaten. De achtergrond van de navigatiebalk toont kort een zwarte achtergrond voordat de app sluit.

  3. Gebruik de knop ‘Recent’ en selecteer de app om deze te hervatten.

  4. De app wordt geopend om de navigatiebalk kort boven een zwarte balk weer te geven. De gebruikersinterface van het systeem stort in in meeslepende modus, maar de zwarte balk blijft.

Deze bug verschijnt ook alleen op Lollipop, niet op KitKat.

Ik heb de app teruggebracht tot het eenvoudig starten van een dummy-activiteit zonder functionaliteit, afgezien van het instellen van systeem-UI-vlaggen:

public class DummyActivity extends FragmentActivity {
@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        setSystemUiVisibility();
    }
}
public void setSystemUiVisibility() {
    if (getWindow() != null && getWindow().getDecorView() != null) {
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        }
    }
}

EDIT:
Nadat ik een nieuw vers project heb gecreberd met alleen deze activiteit heb ik dit probleem gereproduceerd bij het gebruik van een app-thema uitstrekkend “Android: Theme.holo” … en het probleem in dit voorbeeldproject opgelost wanneer ik het materiaalthema in plaats daarvan uitbreiden:

Wijzigen

<style name="AppTheme" parent="android:Theme.Holo.Light.NoActionBar.Fullscreen">
</style>

Naar

<style name="AppTheme"parent="android:Theme.Material.Light.NoActionBar.Fullscreen">
</style>

Helaas heeft deze oplossing de problemen in mijn hoofdproject niet opgelost, maar het brengt me dichter bij een oplossing en kan anderen helpen met hetzelfde probleem.


Antwoord 1, Autoriteit 100%

Ik had hetzelfde probleem. Hier zijn een paar updates die ik maakte, waardoor het verdwijnt. Hopelijk een van deze werkt voor jou!

Activity_main.xml

android:fitsSystemWindows="false"

Style-V21

<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowSharedElementsUseOverlay">false</item>

Mainactivity.java

getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
    );

Antwoord 2, autoriteit 50%

Gebruik

<style name="AppTheme"parent="android:Theme.Material.Light.NoActionBar.Fullscreen"> </style>

het probleem is opgelost, maar het werkt alleen voor api:21.

Om het voor alle systemen te laten werken. U kunt een map maken met de naam style-v21 in de map res en die style.xml daar plaatsen. Android-systeem is slim genoeg om te kiezen welke je wilt gebruiken voor een nieuwe of oude telefoon.


Antwoord 3

Voor mij was het een zwarte balk bovenaan. Het belangrijkste was dit in de activiteitsstijl:

// Important to draw behind cutouts
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> 

Hier is mijn code:

1- In activiteit

private fun hideSystemUI() {
    sysUIHidden = true
    // Enables regular immersive mode.
    // For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE.
    // Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
    window.decorView.systemUiVisibility = (
            View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            or View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
            // Hide the nav bar and status bar
            or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // Hide nav bar
            or View.SYSTEM_UI_FLAG_FULLSCREEN // Hide status bar
            )
}
private fun showSystemUI() {
    sysUIHidden = false
    window.decorView.systemUiVisibility = (
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            // Set the content to appear under the system bars so that the
            // content doesn't resize when the system bars hide and show.
            or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION // layout Behind nav bar
            or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN // layout Behind status bar
            )
}

2- In rootweergave van XML-lay-out

android:fitsSystemWindows="false"

3-stijl voor de volledige schermactiviteit:

<style name="FullscreenTheme" parent="AppTheme">
    <item name="android:actionBarStyle">@style/FullscreenActionBarStyle</item>
    <item name="android:windowActionBarOverlay">true</item>
    <item name="android:windowBackground">@null</item>
    <item name="metaButtonBarStyle">?android:attr/buttonBarStyle</item>
    <item name="metaButtonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
    <item name="android:statusBarColor">#50000000</item>
    <item name="android:navigationBarColor">#50000000</item>
    // Important to draw behind cutouts
    <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> 
</style>
<style name="FullscreenActionBarStyle" parent="Widget.AppCompat.ActionBar">
    <item name="android:background">@color/sysTransparent</item>
</style>

Other episodes