Wie verstecke ich die Navigationsleiste dauerhaft in Android-Aktivitäten?


80

Ich möchte die Navigationsleiste dauerhaft in meiner Aktivität ausblenden (nicht die gesamte System-Benutzeroberfläche). Jetzt benutze ich diesen Code

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

Die Leiste wird ausgeblendet, aber wenn der Benutzer den Bildschirm berührt, wird sie erneut angezeigt. ist es eine Möglichkeit , es permanent , bis Aktivität zu verbergen onStop();



In diesem offiziellen Google / Android-Link finden Sie viele gute und spezifische Details: Aktivieren Sie den Vollbildmodus .
Chris Sprague

Die Markierung wird automatisch gelöscht, wenn der Benutzer den Bildschirm gemäß der Dokumentation berührt. Sie müssen Änderungen an Ihrem UI-Design vornehmen, um die Navigationsleiste ständig auszublenden.
user1154390

Antworten:


117

Schnipsel:

FullScreenFragment.java

HideNavigationBarComponent.java


Dies ist für Android 4.4+

Probieren Sie den immersiven Modus https://developer.android.com/training/system-ui/immersive.html aus

Schneller Ausschnitt (für eine Aktivitätsklasse ):

private int currentApiVersion;

@Override
@SuppressLint("NewApi")
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    currentApiVersion = android.os.Build.VERSION.SDK_INT;

    final int flags = 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;

    // This work only for android 4.4+
    if(currentApiVersion >= Build.VERSION_CODES.KITKAT)
    {

        getWindow().getDecorView().setSystemUiVisibility(flags);

        // Code below is to handle presses of Volume up or Volume down.
        // Without this, after pressing volume buttons, the navigation bar will
        // show up and won't hide
        final View decorView = getWindow().getDecorView();
        decorView
            .setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener()
            {

                @Override
                public void onSystemUiVisibilityChange(int visibility)
                {
                    if((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0)
                    {
                        decorView.setSystemUiVisibility(flags);
                    }
                }
            });
    }

}


@SuppressLint("NewApi")
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
    super.onWindowFocusChanged(hasFocus);
    if(currentApiVersion >= Build.VERSION_CODES.KITKAT && hasFocus)
    {
        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);
    }
}

Wenn Sie Probleme haben, wenn Sie die Lautstärke erhöhen oder verringern, wird dies in Ihrer Navigationsleiste angezeigt. Ich habe Code in onCreatesiehe setOnSystemUiVisibilityChangeListener hinzugefügt

Hier ist eine andere verwandte Frage:

Die Navigation im Immersive-Modus wird nach dem Drücken der Lautstärke oder dem Minimieren und Wiederherstellen klebrig


4
Wenn der Benutzer über den oberen / unteren Bildschirmrand wischt, werden die halbtransparenten Navigationsleisten vorübergehend angezeigt und dann wieder ausgeblendet. IST ES MÖGLICH, DAS AUCH ZU VERSTECKEN?
Finder

@KarthickRamu Ich habe einen Weg gefunden, schau dir einfach meine Antwort an :)
Muhammed Refaat

1
@ MuhammedRefaat Ihr Hinweis benötigt ein gerootetes Gerät :(
Finder

1
@DawidDrozd Vielen Dank, aber ich habe ein Problem. Mein Aktivitätsstammlayout ist RelativeLayout und es hat eine untergeordnete Ansicht, die für Android festgelegt ist: layout_alignParentBottom = "true". Die Navigationsleiste verschwindet, aber die untergeordnete Ansicht wird nicht an den unteren Rand verschoben Könnten Sie helfen, als wäre die Navigationsleiste auf unsichtbar und nicht verschwunden eingestellt?
Jack

1
Wenn Sie den Platz in der Navigationsleiste nutzen möchten, müssen Sie alle Vorkommen android:fitsSystemWindows="true"aus Ihren Ansichten entfernen . Android Studio enthält dieses Attribut beim Generieren einiger Layouts. Siehe stackoverflow.com/a/42501330/650894
Joe Lapp

62

Mach das.

public void FullScreencall() {
    if(Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
        View v = this.getWindow().getDecorView();
        v.setSystemUiVisibility(View.GONE);
    } else if(Build.VERSION.SDK_INT >= 19) {
        //for new api versions.
        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        decorView.setSystemUiVisibility(uiOptions);
    }
}

Dies funktioniert zu 100% und Sie können dies auch für niedrigere API-Versionen tun, auch wenn es eine späte Antwort ist. Ich hoffe, es hilft jemand anderem.

Wenn Sie möchten, dass dies dauerhaft ist, rufen FullscreenCall()Sie einfach Ihre onResume()Methode auf.


2
Ich empfehle einen Blick auf developer.android.com/training/system-ui/immersive.html , in dem erklärt wird, dass Ihre Methode die Leiste einfach ausblendet, bis eine Interaktion stattfindet, und kurz nachdem die Interaktion abgeschlossen ist.
Verlassener Wagen

Vielen Dank - das hat es geschafft! : D: +1
Christopher Stock

5

Für Leute, die nach einer einfacheren Lösung suchen, kann man nur diese eine Codezeile verwenden onStart()

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

Es heißt Immersive Mode. Weitere Möglichkeiten finden Sie in der offiziellen Dokumentation.


4

Laut Android Developer Site

Ich denke, Sie können die Navigationsleiste (soweit ich weiß) nicht dauerhaft verstecken.

Sie können jedoch einen Trick machen. Es ist ein Trick wohlgemerkt.

Nur wenn navigation bardas angezeigt wird, wenn der Benutzer den Bildschirm berührt. Verstecke es sofort wieder. Es macht Spaß.

Überprüfen Sie dies .

void setNavVisibility(boolean visible) {
int newVis = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | SYSTEM_UI_FLAG_LAYOUT_STABLE;
if (!visible) {
    newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN
            | SYSTEM_UI_FLAG_HIDE_NAVIGATION;
}

// If we are now visible, schedule a timer for us to go invisible.
if (visible) {
    Handler h = getHandler();
    if (h != null) {
        h.removeCallbacks(mNavHider);
        if (!mMenusOpen && !mPaused) {
            // If the menus are open or play is paused, we will not auto-hide.
            h.postDelayed(mNavHider, 1500);
        }
    }
}

// Set the new desired visibility.
setSystemUiVisibility(newVis);
mTitleView.setVisibility(visible ? VISIBLE : INVISIBLE);
mPlayButton.setVisibility(visible ? VISIBLE : INVISIBLE);
mSeekView.setVisibility(visible ? VISIBLE : INVISIBLE);
}

Weitere Informationen hierzu finden Sie hier.

Systemleiste in Tablets ausblenden


3

Verwenden:-

view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

In Tablets mit Android 4+ ist es nicht möglich, die System- / Navigationsleiste auszublenden.

Aus der Dokumentation :

Das SYSTEM_UI_FLAG_HIDE_NAVIGATION ist ein neues Flag, das das vollständige Ausblenden der Navigationsleiste anfordert. Beachten Sie, dass dies nur für die Navigationsleiste funktioniert, die von einigen Mobilteilen verwendet wird (die Systemleiste auf Tablets wird nicht ausgeblendet).


2

Es ist meine Lösung:

Definieren Sie zunächst einen Booleschen Wert, der angibt, ob die Navigationsleiste sichtbar ist oder nicht.

boolean navigationBarVisibility = true //because it's visible when activity is created

Zweitens erstellen Methode, die Navigationsleiste ausblenden.

private void setNavigationBarVisibility(boolean visibility){
    if(visibility){
        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN;
        decorView.setSystemUiVisibility(uiOptions);
        navigationBarVisibility = false;
    }

    else
        navigationBarVisibility = true;
}

Wenn Sie nach dem Ausblenden der Navigationsleiste auf Aktivität klicken, wird standardmäßig die Navigationsleiste angezeigt. Wir haben also den Zustand, wenn er sichtbar ist, werden wir ihn verstecken.

Stellen Sie nun OnClickListener auf Ihre Ansicht ein. Ich benutze eine Oberflächenansicht also für mich:

    playerSurface.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            setNavigationBarVisibility(navigationBarVisibility);
        }
    });

Außerdem müssen wir diese Methode aufrufen, wenn die Aktivität gestartet wird. Weil wir es am Anfang verstecken wollen.

        setNavigationBarVisibility(navigationBarVisibility);

2

Es ist ein Sicherheitsproblem: https://stackoverflow.com/a/12605313/1303691

Daher ist es nicht möglich, die Navigation auf einem Tablet mit einem einzigen Anruf zu Beginn der Ansichtserstellung dauerhaft auszublenden. Es wird ausgeblendet, aber beim Berühren des Bildschirms angezeigt. Schon die zweite Berührung Ihres Bildschirms kann zu einem onClickEvent in Ihrem Layout führen. Daher müssen Sie diesen Anruf abfangen, aber ich habe ihn noch nicht verwaltet. Ich werde meine Antwort aktualisieren, wenn ich es herausgefunden habe. Oder hast du jetzt schon die Antwort?


1

Ich denke, der Blow-Code wird Ihnen helfen und diesen Code vor setContentView () hinzufügen.

getWindow().setFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

Fügen Sie diesen Code hinter setContentView () hinzu. GetWindow (). GetDecorView (). SetSystemUiVisibility (View.SYSTEM_UI_FLAG_LOW_PROFILE);


1
Feld erfordert API-Level 21+
zackygaurav

0

Versuche dies:

View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
          | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);

NEIN, es gibt mir das gleiche Ergebnis
Sujith Manjavana

0

Ich denke, dieser Code wird Ihr Problem lösen. Kopieren Sie diesen Code und fügen Sie ihn in Ihre MainActivity.java ein

@Override
protected void onCreate(Bundle savedInstanceState) {                          
    super.onCreate(savedInstanceState);

    View decorView = getWindow().getDecorView();
    decorView.setOnSystemUiVisibilityChangeListener
    (new View.OnSystemUiVisibilityChangeListener() {
        @Override
        public void onSystemUiVisibilityChange(int visibility) {

            if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                hideNavigationBar();
            } 
        }
    });
}



private void hideNavigationBar() {
   getWindow().getDecorView().setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|
        View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}

Es wird auf Android-10 funktionieren. Ich hoffe es wird helfen.


0

Die anderen Antworten verwenden meistens die Flags für die setSystemUiVisibility()Methode in View. Diese API ist jedoch seit Android 11 veraltet. Weitere Informationen finden Sie in meinem Artikel zum Ändern der Sichtbarkeit der Systembenutzeroberfläche. In diesem Artikel wird auch erläutert, wie Sie die Ausschnitte richtig handhaben oder wie Sie die Änderungen der Sichtbarkeit abhören.

Hier sind Codefragmente zum Ein- / Ausblenden von Systemleisten mit der neuen API sowie die aus Gründen der Abwärtskompatibilität veraltete:

/**
 * Hides the system bars and makes the Activity "fullscreen". If this should be the default
 * state it should be called from [Activity.onWindowFocusChanged] if hasFocus is true.
 * It is also recommended to take care of cutout areas. The default behavior is that the app shows
 * in the cutout area in portrait mode if not in fullscreen mode. This can cause "jumping" if the
 * user swipes a system bar to show it. It is recommended to set [WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER],
 * call [showBelowCutout] from [Activity.onCreate]
 * (see [Android Developers article about cutouts](https://developer.android.com/guide/topics/display-cutout#never_render_content_in_the_display_cutout_area)).
 * @see showSystemUI
 * @see addSystemUIVisibilityListener
 */
fun Activity.hideSystemUI() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        window.insetsController?.let {
            // Default behavior is that if navigation bar is hidden, the system will "steal" touches
            // and show it again upon user's touch. We just want the user to be able to show the
            // navigation bar by swipe, touches are handled by custom code -> change system bar behavior.
            // Alternative to deprecated SYSTEM_UI_FLAG_IMMERSIVE.
            it.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
            // make navigation bar translucent (alternative to deprecated
            // WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
            // - do this already in hideSystemUI() so that the bar
            // is translucent if user swipes it up
            window.navigationBarColor = getColor(R.color.internal_black_semitransparent_light)
            // Finally, hide the system bars, alternative to View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            // and SYSTEM_UI_FLAG_FULLSCREEN.
            it.hide(WindowInsets.Type.systemBars())
        }
    } else {
        // 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
        @Suppress("DEPRECATION")
        window.decorView.systemUiVisibility = (
                // Do not let system steal touches for showing the navigation bar
                View.SYSTEM_UI_FLAG_IMMERSIVE
                        // Hide the nav bar and status bar
                        or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        or View.SYSTEM_UI_FLAG_FULLSCREEN
                        // Keep the app content behind the bars even if user swipes them up
                        or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
        // make navbar translucent - do this already in hideSystemUI() so that the bar
        // is translucent if user swipes it up
        @Suppress("DEPRECATION")
        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
    }
}

/**
 * Shows the system bars and returns back from fullscreen.
 * @see hideSystemUI
 * @see addSystemUIVisibilityListener
 */
fun Activity.showSystemUI() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        // show app content in fullscreen, i. e. behind the bars when they are shown (alternative to
        // deprecated View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION and View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
        window.setDecorFitsSystemWindows(false)
        // finally, show the system bars
        window.insetsController?.show(WindowInsets.Type.systemBars())
    } else {
        // Shows the system bars by removing all the flags
        // except for the ones that make the content appear under the system bars.
        @Suppress("DEPRECATION")
        window.decorView.systemUiVisibility = (
                View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
    }
}

Ich habe Ihre Codes mit dem Flag BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE auf dem Emulator ausprobiert, aber die Navigationsleiste wird angezeigt und angezeigt, wenn ich den Bildschirm berühre. Irgendeine Idee, was ich sonst noch einstellen sollte, um die STICKY-Funktionalität auf Android 11 zu erhalten?
Angel Koh

@AngelKoh Sie müssen hideSystemUI () manuell aufrufen, wenn Sie es ausblenden möchten. Überprüfen Sie den Artikel in meiner Antwort, er enthält alle diese Details. Der Sticky-Modus bedeutet, dass die Balken transparent sind, wenn der Benutzer sie nach oben wischt und die App auch die Berührungsereignisse empfängt (siehe developer.android.com/training/system-ui/… ).
Miloš Černilovský

yes hideSystemUI () wird aufgerufen und die Benutzeroberfläche wurde beim ersten Mal ausgeblendet. Wenn ich jedoch danach den Bildschirm berühre, erscheint die Navigationsleiste wieder und bleibt angezeigt.
Angel Koh

Der Zweck von BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE besteht darin, zu verhindern, dass das System Berührungen stiehlt und die Balken anzeigt. Ich bin mir also nicht sicher, was dies verursachen könnte, ohne die echte App zu sehen / zu debuggen.
Miloš Černilovský
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.