web-dev-qa-db-de.com

Höhe der Statusleiste in Android

Wie hoch ist die Statusleiste in Android? Ist es immer das Gleiche?

Aus meinen Messungen scheint es, als wären es 25dp, aber ich bin mir nicht sicher, ob es auf allen Plattformen die gleiche Höhe hat.

(Ich möchte dies wissen, um einen Überblendungsübergang von einer Aktivität ohne Statusleiste auf eine zu implementieren, die dies tut.)

283
hpique

diese Frage wurde vorher beantwortet ........ Höhe der Statusleiste?

Update ::

Aktuelle Methode:

ok, die Höhe der Statusleiste hängt von der Bildschirmgröße ab, zum Beispiel in einem Gerät .__ Mit 240 X 320 Bildschirmgröße beträgt die Statusleistenhöhe 20px, für ein Gerät mit 320 x 480 Bildschirmgröße beträgt die Statusleistenhöhe 25px Für ein Gerät mit 480 x 800 muss die Statusleiste 38 Pixel betragen

daher empfehle ich, dieses Skript zu verwenden, um die Höhe der Statusleiste zu ermitteln

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 Aktivität abzurufen, 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;
} 
322
Elenasys

Von allen Codebeispielen, die ich verwendet habe, um die Höhe der Statusleiste zu ermitteln, scheint die einzige, die in der onCreate-Methode einer Activity tatsächlich zu funktionieren scheint:

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

Anscheinend wird die tatsächliche Höhe der Statusleiste als Android-Ressource beibehalten. Der obige Code kann zu einer ContextWrapper-Klasse (z. B. einer Activity) hinzugefügt werden.

Gefunden am http://mrtn.me/blog/2012/03/17/get-the-ight-of-the-status-bar-in-Android/

190
Ben Clayton

Bei MDPI-Geräten ist die Statusleiste 25px. Wir können dies als Basis verwenden und mit der Dichte multiplizieren (aufgerundet), um die Statusleiste auf jedem Gerät zu ermitteln:

int statusBarHeight = Math.ceil(25 * context.getResources().getDisplayMetrics().density);

Zur Referenz: ldpi = 0,75, mdpi = 1, hdpi = 1,5, xhdpi = 2

49
Grantland Chew

Ich habe einige Lösungen zusammengeführt:

public static int getStatusBarHeight(final Context context) {
    final Resources resources = context.getResources();
    final int resourceId = resources.getIdentifier("status_bar_height", "dimen", "Android");
    if (resourceId > 0)
        return resources.getDimensionPixelSize(resourceId);
    else
        return (int) Math.ceil((VERSION.SDK_INT >= VERSION_CODES.M ? 24 : 25) * resources.getDisplayMetrics().density);
    }

eine andere Alternative: 

    final View view = findViewById(Android.R.id.content);
    runJustBeforeBeingDrawn(view, new Runnable() {
        @Override
        public void run() {
            int statusBarHeight = getResources().getDisplayMetrics().heightPixels - view.getMeasuredHeight();
        }
    });

BEARBEITEN: Alternative zu runJustBeforeBeingDrawn: https://stackoverflow.com/a/28136027/878126

28

Das Festcodieren der Größe oder die Verwendung von Reflektionen zum Ermitteln des Werts von status_bar_height wird als schlechte Praxis betrachtet. Chris Banes sprach darüber auf der Droidcon New York . Die empfohlene Methode zum Ermitteln der Größe der Statusleiste ist der OnApplyWindowInsetsListener :

myView.setOnApplyWindowInsetsListener { view, insets -> {
  val statusBarSize = insets.systemWindowInsetTop
  return insets
}

Dies wurde in API 20 hinzugefügt und wird auch über ViewAppCompat zurückportiert.

28
Niklas

Gemäß Google-Designrichtlinien ; Die Höhe der Statusleiste beträgt 24 dp.

Wenn Sie die Höhe der Statusleiste in Pixel abrufen möchten, können Sie die Methode unten verwenden:

private static int statusBarHeight(Android.content.res.Resources res) {
    return (int) (24 * res.getDisplayMetrics().density);
}

welche aus Aktivität aufgerufen werden kann mit:

statusBarHeight(getResources());
25
Rashid

das funktioniert auch mit der referenz link

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

Die offizielle Höhe ist 24dp, Wie von Google offiziell auf der Android Design-Webseite angegeben. 

14
Joaquin Iurchuk

Ich habe das gleiche Problem, die Statusleistenhöhe in einem onCreate ermitteln zu müssen. Das funktioniert für mich.

private static final int LOW_DPI_STATUS_BAR_HEIGHT = 19;

private static final int MEDIUM_DPI_STATUS_BAR_HEIGHT = 25;

private static final int HIGH_DPI_STATUS_BAR_HEIGHT = 38;

In der onCreate:

DisplayMetrics displayMetrics = new DisplayMetrics();
((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(displayMetrics);

int statusBarHeight;

switch (displayMetrics.densityDpi) {
    case DisplayMetrics.DENSITY_HIGH:
        statusBarHeight = HIGH_DPI_STATUS_BAR_HEIGHT;
        break;
    case DisplayMetrics.DENSITY_MEDIUM:
        statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT;
        break;
    case DisplayMetrics.DENSITY_LOW:
        statusBarHeight = LOW_DPI_STATUS_BAR_HEIGHT;
        break;
    default:
        statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT;
}

Sehen:

http://developer.Android.com/reference/Android/util/DisplayMetrics.htmlhttp://developer.Android.com/guide/practices/ui_guidelines/icon_design.html

13
benhylau

Die voreingestellte Höhe war 25dp. Mit Android Marshmallow (API 23) wurde die Höhe auf 24 dB reduziert.

12
crysxd

Ja, wenn ich es mit View versuche, liefert es das Ergebnis von 25px.

public class SpinActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout lySpin = new LinearLayout(this);
        lySpin.setOrientation(LinearLayout.VERTICAL);       
        lySpin.post(new Runnable()
        {
            public void run()
            {
                Rect rect = new Rect();
                Window window = getWindow();
                window.getDecorView().getWindowVisibleDisplayFrame(rect);
                int statusBarHeight = rect.top;
                int contentViewTop = 
                    window.findViewById(Window.ID_Android_CONTENT).getTop();
                int titleBarHeight = contentViewTop - statusBarHeight;
                System.out.println("TitleBarHeight: " + titleBarHeight 
                    + ", StatusBarHeight: " + statusBarHeight);
            }
        }
    }
}
12
Braj

240x320 - 20px

320x480 - 25px

480x800 + - 38px

10
Denis

Versuche dies:

    Rect rect = new Rect();
    Window win = this.getWindow();
    win.getDecorView().getWindowVisibleDisplayFrame(rect);
    int statusBarHeight = rect.top;
    int contentViewTop = win.findViewById(Window.ID_Android_CONTENT).getTop();
    int titleBarHeight = contentViewTop - statusBarHeight;
    Log.d("ID-Android-CONTENT", "titleBarHeight = " + titleBarHeight );

in der onCreate-Methode für die Aktivität hat es nicht funktioniert, aber als ich es in einen onClickListener steckte und mir eine Messung von 25 gab

6
Martyn

die Höhe der Statusleiste beträgt 24dp in Android 6.0 

 <!-- Height of the status bar -->
 <dimen name="status_bar_height">24dp</dimen>
 <!-- Height of the bottom navigation / system bar. -->
 <dimen name="navigation_bar_height">48dp</dimen>

die Antwort finden Sie im Quellcode: frameworks\base\core\res\res\values ​​\ dimens.xml

5
xiaoyuan hu

Um dieses Problem zu lösen, habe ich einen Kombinationsansatz verwendet .. Dies ist notwendig, da auf Tablets die Systemleiste bereits Pixel subtrahiert, wenn display.getHeight () ..__ heißt. Deshalb überprüfe ich zuerst, ob eine Systemleiste vorhanden ist, und dann nähern sich Ben Claytons, was gut auf Handys funktioniert. 

public int getStatusBarHeight() {
    int statusBarHeight = 0;

    if (!hasOnScreenSystemBar()) {
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "Android");
        if (resourceId > 0) {
            statusBarHeight = getResources().getDimensionPixelSize(resourceId);
        }
    }

    return statusBarHeight;
}

private boolean hasOnScreenSystemBar() {
    Display display = getWindowManager().getDefaultDisplay();
    int rawDisplayHeight = 0;
    try {
        Method getRawHeight = Display.class.getMethod("getRawHeight");
        rawDisplayHeight = (Integer) getRawHeight.invoke(display);
    } catch (Exception ex) {
    }

    int UIRequestedHeight = display.getHeight();

    return rawDisplayHeight - UIRequestedHeight > 0;
}
4
Rutger

Vollbild-Vollbildlösung:

Diese Lösung kann wie eine Problemumgehung aussehen, berücksichtigt jedoch tatsächlich, ob Ihre App im Vollbildmodus ist (dh die Statusleiste wird ausgeblendet) oder nicht:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point(); display.getSize(size);
int barheight = size.y - findViewById(R.id.rootView).getHeight();

Wenn sich Ihre App derzeit im Vollbildmodus befindet, wird barheight gleich 0 sein.

Ich persönlich musste dies verwenden, um die absoluten TouchEvent-Koordinaten so zu korrigieren, dass die Statusleiste berücksichtigt wurde:

@Override
public boolean onTouch(View view,MotionEvent event) {
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point(); display.getSize(size);
    int YCoord = (int)event.getRawY() - size.y + rootView.getHeight());
}

Und das wird die absolute Y-Koordinate erhalten, egal ob die App im Vollbildmodus ist oder nicht.

Genießen

2
Aaron Gillion

In Android 4.1 und höher können Sie festlegen, dass der Inhalt Ihrer Anwendung hinter der Statusleiste angezeigt wird, sodass die Größe des Inhalts nicht geändert wird, wenn die Statusleiste ausgeblendet wird und angezeigt wird. Verwenden Sie dazu SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN. Möglicherweise müssen Sie auch SYSTEM_UI_FLAG_LAYOUT_STABLE verwenden, damit Ihre App ein stabiles Layout beibehält.

Wenn Sie diesen Ansatz verwenden, müssen Sie sicherstellen, dass wichtige Teile der Benutzeroberfläche Ihrer App (z. B. die integrierten Steuerelemente in einer Maps-Anwendung) nicht durch Systemleisten abgedeckt werden. Dadurch könnte Ihre App unbrauchbar werden. In den meisten Fällen können Sie dies umgehen, indem Sie das Attribut Android: fitsSystemWindows zu Ihrer XML-Layoutdatei hinzufügen (true). Dadurch wird die Auffüllung der übergeordneten ViewGroup so angepasst, dass Platz für die Systemfenster bleibt. Dies ist für die meisten Anwendungen ausreichend.

In einigen Fällen müssen Sie jedoch möglicherweise die Standardauffüllung ändern, um das gewünschte Layout für Ihre App zu erhalten. Um direkt zu ändern, wie Ihr Inhalt relativ zu den Systemleisten angeordnet ist (die einen Bereich einnehmen, der als "Inhaltseinsätze" des Fensters bezeichnet wird), überschreiben Sie fitSystemWindows (Rect-Einfügungen). Die Methode fitSystemWindows () wird von der Ansichtshierarchie aufgerufen, wenn sich die Inhaltseinsätze für ein Fenster geändert haben, damit das Fenster seinen Inhalt entsprechend anpassen kann. Durch das Überschreiben dieser Methode können Sie die Einfügungen (und damit das Layout Ihrer App) beliebig behandeln.

formular: https://developer.Android.com/training/system-ui/status.html#behind

2
xiaoyuan hu

Dank @Niklas +1 ist dies der richtige Weg.

public class MyActivity extends Activity implements Android.support.v4.View.OnApplyWindowInsetsListener {

    Rect windowInsets;

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

        setContentView(R.layout.my_activity);

        View rootview = findViewById(Android.R.id.content);

        Android.support.v4.View.ViewCompat.setOnApplyWindowInsetsListener(rootview, this);
    }

    Android.support.v4.View.WindowInsetsCompat Android.support.v4.View.OnApplyWindowInsetsListener.OnApplyWindowInsets(View v, Android.support.v4.View.WindowInsetsCompat insets)
    {
        windowInsets = new Rect();
        windowInsets.set(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom());
        //StatusBarHeight = insets.getSystemWindowInsetTop();

        //Refresh/Adjust view accordingly

        return insets;
    }
}

Bitte entschuldigen Sie, wenn der Code nicht 100% korrekt ist. Er wurde von Xamarin C # konvertiert, aber dies ist der einzige Fehler. Funktioniert mit Kerben usw.

1
Pierre

Wenn Sie die Größe VS Höhe genau kennen

mögen

in einem Gerät mit einer Bildschirmgröße von 320 x 480 beträgt die Statusleistenhöhe beispielsweise 25px, für ein Gerät mit 480x800 muss die Statusleistenhöhe 38px betragen

dann können Sie nur die Breite Ihrer Ansicht/die Bildschirmgröße ermitteln. Sie können einfach eine if-Anweisung verwenden, um die Höhe der Statusleiste zu ermitteln

1
Steven Shih

Der Grund, warum die beste Antwort für manche Benutzer nicht funktioniert, ist, dass Sie die Dimensionen einer Ansicht erst abrufen können, wenn sie gerendert werden kann. Verwenden Sie eine OnGlobalLayoutListener, um die Dimensionen abzurufen, wenn Sie tatsächlich können:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final ViewGroup decorView = (ViewGroup) this.getWindow().getDecorView();
    decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (Build.VERSION.SDK_INT >= 16) {
                decorView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            } else {
                // Nice one, Google
                decorView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
            Rect rect = new Rect();
            decorView.getWindowVisibleDisplayFrame(rect);
            rect.top; // This is the height of the status bar
        }
    }
}

Dies ist die zuverlässigste Methode.

1
user1112789

Dieses Problem wurde kürzlich wegen der Kerbe in meinem Pixel 3XL für mich relevant. Ich mochte wirklich die Lösung für Android-Entwickler , aber ich wollte die Höhe der Statusleiste nach Belieben abrufen, da dies besonders für eine Vollbild-Animation notwendig war, die ich spielen musste. Die Funktion unten ermöglichte eine zuverlässige Abfrage:

private val DEFAULT_INSET = 96
fun getInsets(view: View?): Int {
     var inset = DEFAULT_INSET
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//Safe because only P supports notches
          inset = view?.rootWindowInsets?.stableInsetTop ?: DEFAULT_INSET
     }
     return inset
}

fun blurView(rootView: View?, a: SpacesActivity?) {
    val screenBitmap = getBitmapFromView(rootView!!)
    val heightDifference = getInsets(rootView)
    val croppedMap = Bitmap.createBitmap(
                    screenBitmap, 0, heightDifference,
                    screenBitmap.width,
                    screenBitmap.height - heightDifference)
    val blurredScreen = blurBitmap(croppedMap)
    if (blurredScreen != null) {
         val myDrawable = BitmapDrawable(a!!.resources, blurredScreen)
         a.errorHudFrameLayout?.background = myDrawable
         a.appBarLayout?.visibility = View.INVISIBLE
   }
}

Und dann in der Aktivitätsklasse:

fun blurView() {
    this.runOnUiThread {
        Helper.blurView(this)
    }
}

Sie möchten natürlich einen schwachen Verweis auf die Aktivität an den Methodenparameter der statischen Klasse der Helper-Klasse übergeben, aber der Kürze halber habe ich in diesem Beispiel darauf verzichtet. Die blurBitmapund errorHudFrameLayout werden aus dem gleichen Grund weggelassen, da sie nicht direkt die Höhe der Statusleiste betreffen.

0