2013-05-23 12 views
26

Ist es möglich, die Navigationsleiste für eine Aktivität dauerhaft zu entfernen? Ich möchte die Leiste mit den Schaltflächen entfernen, die auf der Schaltfläche des Bildschirms auf einem Tablet angezeigt werden, nicht auf der Aktionsleiste. Here.Navigationsleiste in einer Aktivität dauerhaft ausblenden

Ich weiß, dass es nicht zu tun ist, habe ich diese Entscheidung nicht getroffen, aber ich muss es tun. Auf meinem Layout gibt es eine andere Schaltfläche, um die Aktivität zu verlassen. Der Rest meiner App kann und hat die Navigationsleiste.

Ich fand diesen Code und passte ihn ein wenig an. Das Problem ist, dass selbst wenn ich die Navigationsleiste ausgeblendet habe, ein schwarzer Bereich übrig geblieben ist. Ich denke, das System berechnet die Bildschirmgröße unter Berücksichtigung der Navigationsleiste?

public static class Content extends ImageView implements View.OnSystemUiVisibilityChangeListener, View.OnClickListener, ActionBar.OnMenuVisibilityListener { 
    Activity mActivity; 
    TextView mTitleView; 
    Button mPlayButton; 
    SeekBar mSeekView; 
    boolean mAddedMenuListener; 
    boolean mMenusOpen; 
    boolean mPaused; 
    boolean mNavVisible; 
    int mLastSystemUiVis; 

    Runnable mNavHider = new Runnable() { 
     @Override public void run() { 
      setNavVisibility(false); 
     } 
    }; 

    public Content(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setOnSystemUiVisibilityChangeListener(this); 
     setOnClickListener(this); 
    } 

    public void init(Activity activity, TextView title, Button playButton, 
      SeekBar seek) { 
     // This called by the containing activity to supply the surrounding 
     // state of the video player that it will interact with. 
     mActivity = activity; 
     mTitleView = title; 
     mPlayButton = playButton; 
     mSeekView = seek; 
     mPlayButton.setOnClickListener(this); 
     setPlayPaused(true); 
    } 

    @Override protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     if (mActivity != null) { 
      mAddedMenuListener = true; 
      mActivity.getActionBar().addOnMenuVisibilityListener(this); 
     } 
    } 

    @Override protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     if (mAddedMenuListener) { 
      mActivity.getActionBar().removeOnMenuVisibilityListener(this); 
     } 
    } 

    @Override public void onSystemUiVisibilityChange(int visibility) { 
     // Detect when we go out of nav-hidden mode, to clear our state 
     // back to having the full UI chrome up. Only do this when 
     // the state is changing and nav is no longer hidden. 
     int diff = mLastSystemUiVis^visibility; 
     mLastSystemUiVis = visibility; 
     if ((diff&SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0 
       && (visibility&SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) { 
      setNavVisibility(true); 
     } 
    } 

    @Override protected void onWindowVisibilityChanged(int visibility) { 
     super.onWindowVisibilityChanged(visibility); 

     // When we become visible or invisible, play is paused. 
     setPlayPaused(true); 
    } 

    @Override public void onClick(View v) { 
     if (v == mPlayButton) { 
      // Clicking on the play/pause button toggles its state. 
      setPlayPaused(!mPaused); 
     } else { 
      // Clicking elsewhere makes the navigation visible. 
      setNavVisibility(true); 
     } 
    } 

    @Override public void onMenuVisibilityChanged(boolean isVisible) { 
     mMenusOpen = isVisible; 
     setNavVisibility(true); 
    } 

    void setPlayPaused(boolean paused) { 
     mPaused = paused; 
     mPlayButton.setText(paused ? R.string.play : R.string.pause); 
     setKeepScreenOn(!paused); 
     setNavVisibility(true); 
    } 

    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); 
    } 

} 
+0

Wie du bist diesen Code singen? –

Antwort

5

AFAIK, Dies ist ohne root-Zugriff nicht möglich. Es wäre ein Sicherheitsproblem, eine App zu haben, die nicht mit Systemknöpfen verlassen werden kann.

bearbeiten, siehe hier: Hide System Bar in Tablets

4

Ändern Sie das Thema in Ihrem Manifest.

Wenn Sie Navigationsleiste für eine Aktivität verbergen möchten, können Sie diese verwenden:

<activity 
     android:name="Activity Name" 
     android:theme="@android:style/Theme.Black.NoTitleBar" 
     android:label="@string/app_name" > 

Wenn Sie Navigationsleiste für gesamte Anwendung ausblenden möchten Sie diese verwenden können:

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@android:style/Theme.Black.NoTitleBar" > 
+2

Ich möchte die Navigationsleiste entfernen, nicht die Aktionsleiste. Ich möchte die Schaltflächen ausblenden, die am unteren Bildschirmrand für Tablets angezeigt werden. –

+0

Hallo Steve, es gibt einige Unverständnis Probleme mit diesen Antworten zu lesen. Jeder möchte, dass Sie die Aktionsleiste entfernen. LOL. Haben Sie es jemals für 4.0 und höher herausgefunden? Danke – steveh

57

Es gibt eine Lösung mit KitKat (4.4.2) starten, Fesselnde Modus genannt: https://developer.android.com/training/system-ui/immersive.html

Grundsätzlich sollten Sie diesen Code auf Ihre onResume hinzufügen() -Methode:

View decorView = getWindow().getDecorView(); 
decorView.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); 
+1

sollte akzeptiert werden Antwort – Jaysbays

+7

Es ist nicht dauerhaft. also ist es nicht als akzeptierte Antwort berechtigt. –

19

Sie können

Es gibt Zwei Möglichkeiten:

1- Wurzel des Geräts, dann öffnen Sie das Gerät in adb window command und dann die folgenden ausführen:

adb shell > 
su > 
pm disable com.android.systemui > 

und es zu tun bekommen wieder nur das gleiche, aber disable ändern enable.

2- die folgende Zeile bis zum Ende der Geräts build.prop Datei hinzufügen:

qemu.hw.mainkeys = 1 

dann, ihn zurückzubekommen es einfach entfernen.

und wenn Sie nicht wissen, wie build.prop Datei bearbeiten:

  • herunterladen EsExplorer auf Ihrem Gerät und suchen Sie nach build.prop dann ändern Berechtigungen es lesen und schreiben, schließlich fügen Sie die Linie.
  • herunterladen eine spezialisierte build.prop Editor-App wie build.propEditor.
  • oder beziehen Sie sich auf that link.
+0

Wissen Sie genau welche Funktionalität com.android.systemui hat? – JohnyTex

+0

Wissen Sie, ob qemu.hw.mainkeys = 1 für alle Geräte mit Softwareknöpfen funktioniert? – JohnyTex

+0

@JohnyTex com.android.systemui zum Deaktivieren einiger vom System hinzugefügter UI-Funktionen wie Navigationsleisten und Hintergrundbild. Und wenn Sie über qemu.hw.mainkeys = 1 sprechen, was meinen Sie mit "Geräte mit Softwareknöpfen"? –

2

Nachdem den DevBytes beobachtete video (von Roman Nurik) und die letzte Zeile in der Dokumentation zu lesen, das sagt:

Hinweis: Wenn Sie das Auto-Versteck Verhalten von IMMERSIVE_STICKY sondern müssen Zeigen Sie auch Ihre eigenen UI-Steuerelemente. Verwenden Sie einfach IMMERSIVE in Kombination mit Handler.postDelayed() oder etwas Ähnlichem, um nach einigen Sekunden wieder in den Immersive-Modus zu wechseln.

die Antwort, gab Radu122, arbeitete für mich. Richte einfach einen Handler ein und es wird dir gut gehen.

Hier ist der Code, die für mich funktioniert:

@Override 
protected void onResume() { 
    super.onResume(); 
    executeDelayed(); 
} 


private void executeDelayed() { 
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      // execute after 500ms 
      hideNavBar(); 
     } 
    }, 500); 
} 


private void hideNavBar() { 
    if (Build.VERSION.SDK_INT >= 19) { 
     View v = getWindow().getDecorView(); 
     v.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); 
    } 
} 

Google sagt, „nach ein paar Sekunden“ - aber ich diese Funktionalität so schnell wie möglich zur Verfügung stellen möchten. Vielleicht werde ich den Wert später ändern, wenn ich muss, werde ich diese Antwort aktualisieren.

+1

Nun, das ist die schrecklichste Art zu tun, aber Google empfohlen, auf solche Weise zu verwenden .. Wirklich können sie nicht einen guten Weg zu bieten mach das? Was für eine Idiokratie –

+0

Ich bin bei dir. Vielleicht bietet die Plattform jetzt eine bessere Lösung. –

+0

Ich fürchte nein ... Ich versuche derzeit zu finden, aber keine Möglichkeit ... nur Google saugt große Zeit zu geben wirklich hilfreich apis –

12

Sie können Navigationsleiste auszublenden, rufen Sie einfach diese Methode auf das onCreate(),

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

Das wird ganz nagiation panel.hope verstecken hilft es Ihnen

+1

Hallo, wie auch immer, um die Tasten nach einem Eingabefokus in einer Webansicht zu verbergen, die das Schlüsselwort zeigt? – Patrick

+1

Es ist nicht dauerhaft! –

+0

Tippfehler? Kommentar sollte sagen // für höhere APIs – user1010160

0

Von Google-Dokumentation:

können Sie Blenden Sie die Navigationsleiste unter Android 4.0 und höher mit dem Flag SYSTEM_UI_FLAG_HIDE_NAVIGATION aus. Dieser Ausschnitt versteckt sowohl die Navigationsleiste und die Statusleiste:

View decorView = getWindow().getDecorView(); 
// Hide both the navigation bar and the status bar. 
// SYSTEM_UI_FLAG_FULLSCREEN is only available on Android 4.1 and higher, but as 
// a general rule, you should design your app to hide the status bar whenever you 
// hide the navigation bar. 
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
       | View.SYSTEM_UI_FLAG_FULLSCREEN; 
decorView.setSystemUiVisibility(uiOptions); 

http://developer.android.com/training/system-ui/navigation.html

+0

Es ist nicht dauerhaft. –

2

starten durch in onResume() der Aktivität versteckt halten dann auch wie unten dargestellt versteckt:

decorView.setOnSystemUiVisibilityChangeListener 
       (new View.OnSystemUiVisibilityChangeListener() { 
        @Override 
        public void onSystemUiVisibilityChange(int visibility) { 
         // Note that system bars will only be "visible" if none of the 
         // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set. 
         if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { 
          //visible 
          hideSystemUI(); 
         } 
        } 
        } 
       });` 

    public void hideSystemUI() { 
     // Set the IMMERSIVE flag. 
     // Set the content to appear under the system bars so that the content 
     // doesn't resize when the system bars hide and show. 
     decorView.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 // hide nav bar 
         | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar 
         | View.SYSTEM_UI_FLAG_IMMERSIVE); 
    } 
0

Meine Lösung, nur die Navigationsleiste zu verstecken, ist:

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

    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(
         View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
           | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
           | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
           | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 
      } 
     } 
    }); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    final int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; 
    final View decorView = getWindow().getDecorView(); 
    decorView.setSystemUiVisibility(uiOptions); 
} 
+0

Woher hast du die 'getWindow()'? An meinem Ende heißt es: ** Kann das Symbol getWindow() nicht lesen. ** –

Verwandte Themen