it-swarm.com.de

Ermitteln Sie zuverlässig die Höhe der Statusleiste, um das durchsichtige Navigationsproblem von KitKat zu lösen

Ich experimentiere mit der neuen transparenten Android 4.4-Navigationsleiste und möchte die Navigationsleiste mithilfe der Markierung FLAG_TRANSLUCENT_NAVIGATION als durchscheinend festlegen. Ich möchte nur, dass die Navigationsleiste (Zurück, Home-Button usw.) durchscheinend ist. Ich möchte, dass die Statusleiste oben auf dem Bildschirm normal angezeigt wird. NICHT durchscheinend.

Der Code, den ich dazu benutze, lautet:

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, dass Android nun die Aktivität als Vollbild sieht und das Layout hinter der Navigationsleiste platziert (was korrekt ist). Leider wird auch das Layout hinter der Statusleiste angezeigt (ein Problem).

Eine harte Lösung für dieses Problem wäre, eine Auffüllung oben in der übergeordneten Layoutansicht anzuwenden. Allerdings muss ich dazu die Höhe der Statusleiste bestimmen.

Könnte jemand vorschlagen, wie ich die Höhe der Statusleiste erreiche, ist dies nicht so unbedeutend, wie ich gedacht hätte, oder alternativ eine geeignete Lösung vorschlagen.

Vielen Dank

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

Verwenden Sie den obigen Code in der onCreate-Methode. Legen Sie es in eine contextWrapper-Klasse. http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-Android/

56
user2511882

Seit Api 21 gibt es ein offizielles Verfahren zum Abrufen von Einfügungen für die Statusleiste und die Höhe der Navigationsleiste, wenn sie durchscheinend 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;
        }
    });
22

Die Höhe der unteren Navigationsleiste beträgt 48 dp (im Hoch- und Querformat) und 42 dp, wenn die Leiste vertikal platziert wird.

Hoffe das hilft.

3
Aritra Roy

Die akzeptierte Antwort gibt immer die Höhe der Statusleiste zurück (und etwas hackig). Einige Aktivitäten sind jedoch möglicherweise im Vollbildmodus, und diese Methode unterscheidet nicht zwischen ihnen.

Diese Methode funktioniert perfekt, um die Höhe der Statusleiste relativ zur aktuellen Aktivität zu ermitteln (platzieren Sie sie in Ihrer Activity-Klasse und verwenden Sie sie, sobald das Layout beendet ist):

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

Beachten Sie, dass Sie auch displayRect direkt verwenden können, falls Sie andere "Fensterdekorationen" am unteren Rand oder möglicherweise sogar an den Seiten des Bildschirms haben. 

3
Mete

es wird empfohlen, dieses Skript zu verwenden, um die Höhe der Statusleiste abzurufen

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) Um die Höhe der Statusleiste der onCreate () -Methode Ihrer Activity 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;
}
0
Yogesh Rathi