Высота строки состояния в Android - PullRequest
302 голосов
/ 04 августа 2010

Какая высота строки состояния в Android? Это всегда одно и то же?

По моим измерениям кажется, что это 25dp, но я не уверен, что он имеет одинаковую высоту на всех платформах.

(я хочу знать это, чтобы правильно реализовать переход с постепенным исчезновением из действия, у которого нет строки состояния, к тому, у которого есть строка)

Ответы [ 21 ]

342 голосов
/ 05 августа 2010

на этот вопрос был дан ответ раньше ... Высота строки состояния?

Обновление ::

Текущий метод:

хорошо, высота строки состояния зависит от размера экрана, например, в устройстве с размером экрана 240 x 320 высота строки состояния составляет 20 пикселей, для устройства с размером экрана 320 x 480 высота строки состояния составляет 25 пикселей, длядля устройства с разрешением 480 x 800 высота строки состояния должна составлять 38px

, поэтому я рекомендую использовать этот сценарий для получения высоты строки состояния

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

(старый метод) для получения высотыв строке состояния метода onCreate() вашей Деятельности используйте этот метод:

public int getStatusBarHeight() { 
      int result = 0;
      int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
      if (resourceId > 0) {
          result = getResources().getDimensionPixelSize(resourceId);
      } 
      return result;
} 
200 голосов
/ 08 января 2013

Из всех примеров кода, которые я использовал для получения высоты строки состояния, единственное, что действительно работает в методе onCreate для Activity, это:

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

Видимо, фактическая высота строки состояния сохраняется как ресурс Android. Вышеупомянутый код может быть добавлен к классу ContextWrapper (например, Activity).

Найдено на http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/

48 голосов
/ 04 октября 2011

На устройствах MDPI строка состояния составляет 25 пикселей. Мы можем использовать это в качестве основы и умножить на плотность (округлить в большую сторону), чтобы получить высоту строки состояния на любом устройстве:

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

Для справки: ldpi = 0,75, mdpi = 1, hdpi = 1,5, xhdpi = 2

34 голосов
/ 05 ноября 2017

Жесткое кодирование размера или использование отражения для получения значения status_bar_height считается плохой практикой. Крис Бейнс говорил об этом в Droidcon New York . Рекомендуемый способ получения размера строки состояния - через OnApplyWindowInsetsListener :

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

Это было добавлено в API 20 и также перенесено через ViewAppCompat .

31 голосов
/ 10 марта 2015

Я объединил несколько решений:

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

другая альтернатива:

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

РЕДАКТИРОВАТЬ: альтернатива runJustBeforeBeingDrawn: https://stackoverflow.com/a/28136027/878126

25 голосов
/ 17 сентября 2015

В соответствии с Руководством по дизайну Google ;высота строки состояния составляет 24 dp.

Если вы хотите получить высоту строки состояния в пикселях, вы можете использовать следующий метод:

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

, который можно вызвать из действия с:

statusBarHeight(getResources());
18 голосов
/ 13 мая 2013

это также работает с ссылкой ссылка

public int getStatusBarHeight() {
  int result = 0;
  int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
  if (resourceId > 0) {
      result = getResources().getDimensionPixelSize(resourceId);
  }
  return result;
}
13 голосов
/ 27 апреля 2016

Высота по умолчанию была 25dp. С Android Marshmallow (API 23) высота была уменьшена до 24dp.

Обновление: имейте в виду, что с тех пор, как начался возраст надрезов и камер с перфорацией, использование статической высоты для строки состояния больше не работает. Пожалуйста, используйте вместо окна вставки!

13 голосов
/ 01 февраля 2011

У меня та же проблема с необходимостью получить высоту строки состояния в onCreate. Это работает для меня.

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;

Внутри 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;
}

См:

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

13 голосов
/ 24 июня 2015

Официальный рост 24dp, как официально заявлено Google на веб-странице Android Design .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...