2013-12-14 1 views
23

Ich experimentiere mit den neuen Android 4.4 transluzenten Navigationsleisten und möchte die Navigationsleiste als transparent mit der FLAG_TRANSLUCENT_NAVIGATION Flag setzen. Ich möchte nur, dass die Navigationsleiste (zurück, Home-Taste usw.) durchscheinend ist - ich möchte, dass die Statusleiste oben auf dem Bildschirm normal angezeigt wird. NICHT durchscheinend. auch leiderZuverlässige Höhe der Statusleiste zu lösen KitKat transluzente Navigation Problem

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
    Window w = getWindow(); 
    w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); 
} 

Das Problem, das ich habe, ist Android nun die Aktivität ist größer anzeigen und legt das Layout hinter der Navigationsleiste denkt (was richtig ist), ist es:

Der Code, den ich dies zu erreichen, verwende ist platziert das Layout hinter der Statusleiste (ein Problem).

Ein Hacky-Fix ​​für diese würde eine Auffüllung an der Spitze der Layout-übergeordneten Ansicht anwenden, aber ich muss die Höhe der Statusleiste bestimmen, um dies zu tun.

Könnte jemand vorschlagen, wie ich die Höhe der Statusleiste bekomme, ist es nicht so trivial wie ich dachte, oder alternativ schlagen Sie eine richtige Lösung vor.

Dank

+0

Hallo Milo, ich habe das gleiche Problem hier. Ich habe diese Problemumgehung versucht, aber mein Layout bleibt hinter meinem ActionBAR. Ich habe ein Top-Padding zu meinem Root-Layout hinzugefügt, aber ich denke, die Statusleiste Höhe ist nicht genug, haben Sie das gleiche Problem? Ich muss eine obere Polsterung für beide Höhen einstellen? – noni

+0

Noni, ich bekomme die Wurzelansicht der Aktivität wie folgt: getWindow(). GetDecorView(). FindViewById (android.R.id.Inhalt); Ich dann Padding Ie anwenden. setPadding (0, statusBarHeight, 0, 0); Hoffe, dass hilft. – Milo

Antwort

54
public int getStatusBarHeight() { 
     int result = 0; 
     int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
     if (resourceId > 0) { 
      result = getResources().getDimensionPixelSize(resourceId); 
     } 
     return result; 
} 

den obigen Code in der onCreate Methode verwenden. Fügen Sie es in eine contextWrapper-Klasse ein. http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/

+0

Das scheint zu funktionieren, weißt du, ob das auf allen Android-Versionen 4.1 und höher funktioniert? Ich erinnere mich, dass das Lesen dieser Lösung auf Transformer-Tablets möglicherweise nicht funktioniert, und ich frage mich, ob dies auch auf anderen Geräten fehlschlägt. – Milo

+0

es ist nur für das Transformator Tablet, soweit ich weiß. Funktioniert gut auf anderen Geräten, die ich getestet habe. Und vergiss nicht zu akzeptieren und upvote. Prost – user2511882

+1

Es ist schade, es gibt keine zuverlässige Methode, um die Höhe der Statusleiste auf jedem Gerät zu erhalten. Das heißt, es wird für jetzt tun müssen. – Milo

3

Die Höhe der unteren Navigationsleiste beträgt 48dp (im Hoch- und Querformat) und 42dp, wenn der Balken vertikal angeordnet ist.

Hoffe, das hilft.

+0

ich irgendwie kam dies durch Experimente, aber die Zuverlässigkeit ..., die ich nicht kenne – frostymarvelous

+1

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/res/values/dimens .xml das bedeutet scheinbar, dass es eine zuverlässige Figur ist 48dp frostymarvelous

18

Seit api 21 gibt es offizielle Verfahren für Einsätze für Statusleiste und Navigationsleiste Höhe Abrufen wenn scheinend ist

ViewCompat.setOnApplyWindowInsetsListener(view, new OnApplyWindowInsetsListener() { 
     @Override 
     public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) { 
      final int statusBar = insets.getSystemWindowInsetTop(); 
      final int navigationBar = insets.getSystemWindowInsetBottom(); 
      return insets; 
     } 
    }); 
+0

Super nützlich! Das einzige, was im Multi-Window-Modus mit Android 7.0 wie erwartet funktioniert. – Petrus

+0

diese Art der Ansicht ist "Ansicht"? – urSus

2

Die akzeptierte Antwort auf die Statusleiste Höhe immer wieder (und in etwas hacky Weg). Einige Aktivitäten können jedoch tatsächlich Vollbild sein und diese Methode unterscheidet nicht zwischen ihnen.

Diese Methode funktioniert für mich perfekt auf die Statusleiste Höhe in Bezug auf die aktuelle Aktivität zu finden (legen Sie sie in Ihrer Aktivitätsklasse, und es zu benutzen, wenn das Layout fertig ist):

public int getStatusBarHeight() { 
    Rect displayRect = new Rect(); 
    getWindow().getDecorView().getWindowVisibleDisplayFrame(displayRect); 
    return displayRect.top; 
} 

Hinweis kann man auch nur Verwenden Sie displayRect direkt für den Fall, dass Sie andere "Fensterdekorationen" an der Unterseite oder möglicherweise sogar an den Seiten des Bildschirms haben.

+0

Dies funktioniert für 10.1 WXGA-Tabellenemulator, der in API 16 keine Statusleiste anzeigt, da er Statusinformationen in der unteren Navigationsleiste ablegt. Suchen Sie noch nach einer Möglichkeit, die Höhe der Statusleiste und/oder den Anzeigestatus * vor * Layout zu bestimmen. – jk7

0

empfehlen dieses Skript zu verwenden, um die Statusleiste Höhe

Rect rectangle = new Rect(); 
Window window = getWindow(); 
window.getDecorView().getWindowVisibleDisplayFrame(rectangle); 
int statusBarHeight = rectangle.top; 
int contentViewTop = 
    window.findViewById(Window.ID_ANDROID_CONTENT).getTop(); 
int titleBarHeight= contentViewTop - statusBarHeight; 

    Log.i("*** Elenasys :: ", "StatusBar Height= " + statusBarHeight + " , TitleBar Height = " + titleBarHeight); 

(alte Methode) zu erhalten, die Höhe der Statusleiste auf der onCreate() -Methode Ihre Aktivität zu erhalten, verwenden Sie diese Methode:

public int getStatusBarHeight() { 
     int result = 0; 
     int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
     if (resourceId > 0) { 
      result = getResources().getDimensionPixelSize(resourceId); 
     } 
     return result; 
}