Высота строки состояния в Android

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

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

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


person hpique    schedule 04.08.2010    source источник
comment
Если вы выполняете перекрестное затухание, вам не нужно знать высоту строки состояния.   -  person stealthcopter    schedule 04.08.2010
comment
Мне это нужно, потому что некоторые элементы располагаются в макете по центру, и я бы хотел, чтобы они плавно переходили друг в друга.   -  person hpique    schedule 04.08.2010


Ответы (23)


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

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

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

хорошо, высота строки состояния зависит от размера экрана, например, на устройстве с размером экрана 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;
} 
person Jorgesys    schedule 04.08.2010
comment
Не совсем. Я также спрашиваю, могу ли я предположить, что строка состояния имеет одинаковую высоту на всех устройствах. - person hpique; 05.08.2010
comment
Или использовать дип? Если он всегда имеет 25dip, то код не нужен. - person hpique; 06.08.2010
comment
вы не можете предположить, что это всегда 25dp (проверьте высоту, например, на разжигающем огне). - person DallinDyer; 19.01.2012
comment
@hgpc, нет! вы должны получить значение высоты - person Jorgesys; 26.03.2012
comment
это также работает с панелью действий и системной панелью, представленной в Android API11+? - person android developer; 05.06.2012
comment
Re: высота строки состояния зависит от размера экрана, например, на устройстве с размером экрана 240 X 320 высота строки состояния составляет 20 пикселей, для устройства с размером экрана 320 X 480 высота строки состояния составляет 25 пикселей, для устройство с разрешением 480 x 800, высота строки состояния должна быть 38 пикселей - это просто измеренные значения пикселей для конкретных устройств, имеющих такие размеры? Поскольку, поскольку плотность может различаться на разных устройствах, это могут быть одни и те же 25 независимых от плотности пикселей, умноженные на dpi / 160 (стандартная плотность). Например, устройство с разрешением 240 точек на дюйм будет иметь строку состояния 25 * (240/160) = 38. - person Carl; 11.12.2012
comment
Не работает в runnable, переданном в view.post() в onCreate() — возвращает 0 - person User; 20.04.2013
comment
результат в px? - person Paul; 14.07.2013
comment
@Paul, да в пикселях. - person Jorgesys; 14.07.2013
comment
В View.post(new Runnable(){}) это приводит к тому, что строка int titleBarHeight = contentViewTop - statusBarHeight; вычисляется для меня как 0 = 75 - 75. - person MeanderingCode; 29.08.2014
comment
Если вы хотите учитывать полноэкранные реализации в своем коде, вы, возможно, захотите проверить флаг видимости системного пользовательского интерфейса: (decorView.getSystemUiVisibility() & View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) == View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - person Dallas; 16.06.2015
comment
Устройство с размером экрана 720 X 1280 (xhdpi) имеет строку состояния высотой 50 пикселей. - person Chintan Shah; 18.05.2016
comment
разве верхняя часть строки состояния не находится над верхним содержанием??? должно быть... int titleBarHeight= statusBarHeight - contentViewTop; у меня плохо с математикой и все такое... - person me_; 15.12.2016
comment
@me_ left top — это источник, означающий, что значение contentViewTop больше, чем statusBarHeight. - person Sabeeh; 13.07.2017
comment
@Jorgesys У меня есть опасения по поводу точности вашего ответа. contentViewTop на самом деле является высотой самого Toolbar, поэтому не нужно ничего вычитать. (@id/content).getTop() возвращает вершину относительно своего родителя, и единственным дочерним элементом выше @id/content является toolbar (status bar не является дочерним элементом в текущем родительском элементе). Следовательно, значение, возвращаемое window.findViewById(Window.ID_ANDROID_CONTENT).getTop(), на самом деле является высотой панели инструментов. Я проверил это в эмуляторе. Пожалуйста, поправьте меня, если я ошибаюсь. - person Sabeeh; 13.07.2017
comment
window.getDecorView().getWindowVisibleDisplayFrame(rectangle) не является правильным способом получить высоту строки состояния, если вы находитесь в многооконном режиме + портретное вращение + второе окно. Вы получите огромное значение (включая 1-ю высоту). - person Tuan Chau; 07.06.2018
comment
В Multi-Window (активность с изменяемым размером) новый метод не работает должным образом. Лучше один старый метод. - person H. Farid; 06.02.2019
comment
Обновленный ответ довольно хорош. Единственное, что я бы изменил, это statusBarHeight на statusBarTop - person Leo Droidcoder; 01.07.2019

Из всех примеров кода, которые я использовал для получения высоты строки состояния, единственный, который действительно работает в методе 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/

person Ben Clayton    schedule 08.01.2013
comment
Вместо жесткого кодирования лучше вычислять динамически. Вышеупомянутый метод работал для меня! - person alchemist; 05.07.2013
comment
разве вы не должны использовать getDimension(...) вместо этого? - person android developer; 19.11.2013
comment
Предостережение — это работает не на всех устройствах. Например. на Transformer TF201 (а также на TF101, TF300 и некоторых других устройствах) высота сообщается как 25, где нет строки состояния. - person Błażej Czapp; 28.11.2013
comment
Основываясь на приведенных выше комментариях, мне кажется, что код сообщает вам, какова высота строки состояния на конкретном устройстве, а не какая она на конкретном действии (которое на самом деле может не иметь строки состояния). - person dazed; 15.12.2015
comment
в XML можно использовать ресурс dimen @android:dimen/status_bar_height. ‹!-- Высота строки состояния, определенная в исходном файле системы Android --› ‹dimen name=status_bar_height›24dp‹/dimen›. Но вы не можете напрямую ссылаться на него в своем проекте приложения. Таким образом, вы должны использовать код. - person Tshunglee; 12.12.2018

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

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

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

person Niklas    schedule 05.11.2017
comment
Это самый точный ответ на сегодняшний день - person keith; 06.02.2018
comment
для меня это срабатывает только один раз, если у меня есть фрагменты через нижнюю навигацию. Если я снова заменю фрагмент, этот слушатель не будет вызван, есть ли также совместимый геттер? - person urSus; 11.03.2018
comment
И все же этот API ужасен, потому что за кулисами огромное количество WTF / Gotchas. Вы могли бы подумать, что можете сделать это с любым представлением, но нет, вам нужно переопределить определенные вещи и убедиться, что ВЫ передаете вставки своим дочерним элементам (??), потому что НЕКОТОРЫЕ ViewGroups будут (материальный дизайн), а ВСЕ ДРУГИЕ нет ( линейная компоновка — ConstraintLayout — привет?). Вместо системы с Window.getStatusBarSize()… мы должны ПОДПИСАТЬСЯ НА ЧЕРТОВУЮ СЛУШАТЕЛЬНИЦУ… иди домой, Android, ты пьян. Просто жестко задайте размер, пока Google не проснется, мы в 2018 году. Я надеюсь, что Крис Бэйнс увидит это однажды… - person Martin Marconcini; 19.06.2018
comment
В моем случае не увольняют. Я поставил Activity#onCreated. Я сделал что-то не так? Кроме того, почему мы не используем mView.getRootWindowInsets()? - person Adil Aliyev; 26.10.2018
comment
Вам нужно вызвать view.onApplyWindowInsets, потому что в противном случае собственный метод представления не будет вызываться. Более того, ваш код синтаксически неверен (неуместная фигурная скобка, оператор возврата из закрытия). - person digory doo; 30.03.2021

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

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

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

person Grantland Chew    schedule 04.10.2011
comment
Это правильно для устройств, которые имеют строку состояния. Обратите внимание, что поскольку выше было написано, стало правдой, что не на всех устройствах он будет. В частности, устройства с ICS могут иметь комбинированную панель состояния/навигации внизу и вообще ничего вверху. Таким образом, в этом случае, для большинства целей программирования, вы хотели бы назначить нулевую высоту для строки состояния, но приведенная выше формулировка даст вам ненулевой размер. - person Carl; 12.12.2012
comment
Также значение 25px неверно для всех устройств mdpi. Он может варьироваться в зависимости от уровня API. Например, устройство-эмулятор планшета 10.1 WXGA сообщает о 25 пикселях в API 16 и 19, но 24 пикселях в API 24. - person jk7; 26.07.2017

Я объединил некоторые решения вместе:

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

person android developer    schedule 10.03.2015
comment
getResources().getDisplayMetrics().heightPixels -getActivity().findViewById(android.R.id.content).getMeasuredHeight() не работает в android lolipop - person abbasalim; 02.09.2015
comment
@ ArMo372 Обновленный ответ. Просто представление должно сначала пройти измерение. Вам не нужно использовать runJustBeforeBeingDrawn, если вы уже прошли его. Вы будете использовать его только в слишком ранних случаях. - person android developer; 15.08.2016

Согласно руководству по использованию материалов; высота строки состояния 24 dp.

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

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

который можно вызвать из активности с помощью:

statusBarHeight(getResources());
person Rashid    schedule 17.09.2015
comment
До Marshmallow это было 25dp. Начиная с Зефира это 24dp. - person Eugen Pechanec; 18.09.2015
comment
это, по сути, жесткое кодирование значения, которое не позволяет изменять дизайн - person siliconeagle; 28.06.2017
comment
и не учитывает тот факт, что строка состояния не будет отображаться в тех же случаях - person jk7; 26.07.2017
comment
Вот последняя ссылка: material.io/design/platform-guidance. / - person dumbfingers; 10.02.2021

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

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

person crysxd    schedule 27.04.2016
comment
сладкий! Я только что сделал dimens.xml специально для уровня API 23+, где я жестко запрограммировал высоту как 24dp. - person Someone Somewhere; 19.04.2018


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

person Joaquin Iurchuk    schedule 24.06.2015

У меня такая же проблема, как получить высоту строки состояния в 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

person benhylau    schedule 01.02.2011
comment
Мне нравится ваша идея использования значений, основанных на плотности. Если вы собираетесь использовать код в нескольких местах (или использовать другие значения, связанные с плотностью), я предпочитаю разгрузить работу в системе и сохранить значения в ресурсе измерения, что делает переключение ненужным. Вам необходимо создать папку и файл ресурсов для каждого измерения для каждой плотности. конечные ресурсы res = context.getResources(); инт статусбарВысота = 0; попробуйте { statusbarHeight = res.getDimensionPixelSize (R.dimen.android_statusbar_height); } поймать (NotFoundException e) {} - person ProjectJourneyman; 13.12.2011
comment
Жесткое кодирование этих значений опасно, что, если они изменятся в более поздней версии платформы? - person David Snabel-Caunt; 22.02.2012
comment
Я думаю, что вместо жестко заданных размеров пикселей (по одному для каждой плотности) лучше использовать 25dp. - person android developer; 10.03.2015

Да, когда я пробую это с View, он дает результат 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);
            }
        }
    }
}
person Braj    schedule 28.01.2011
comment
Приведенный выше код работает для меня, когда я создаю новый линейный макет, как вы сделали выше, но когда я делаю findviewbyid для lySpin из xml. то он возвращает ноль. не понимая y он ведет себя так. - person Shaista Naaz; 23.06.2011
comment
Потому что макет еще не знает своего размера в onCreate, потому что он еще не закончил отрисовку. Что я обычно делаю, так это публикую Runnable в потоке пользовательского интерфейса из onCreate, что дает пользовательскому интерфейсу время для рисования. - person Jason Robinson; 18.01.2012

240 x 320–20 пикселей

320 x 480–25 пикселей

480 x 800+ – 38 пикселей

person Denis    schedule 18.11.2010
comment
Это уже не точно. Используйте метод измерения строки состояния. - person Michael; 03.01.2019

Попробуй это:

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

это не сработало для меня в методе onCreate для действия, но сработало, когда я поместил его в onClickListener и дал мне измерение 25

person Martyn    schedule 04.08.2010
comment
Я подозреваю, что на момент проверки в onCreate() строка состояния еще не была создана. Напротив, когда он вручную щелкнул, чтобы активировать свой код onClickListener(), полоса уже имела достаточно времени для отображения, и он смог получить ее размер. - person Carl; 26.05.2012

Версия Kotlin, сочетающая в себе два лучших решения

fun getStatusBarHeight(): Int {
    val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android")
    return if (resourceId > 0) resources.getDimensionPixelSize(resourceId)
    else Rect().apply { window.decorView.getWindowVisibleDisplayFrame(this) }.top
}
  1. Принимает значение status_bar_height, если присутствует
  2. Если status_bar_height отсутствует, вычисляет высоту строки состояния из оформления окна.
person tomrozb    schedule 23.05.2020

высота строки состояния 24dp в 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>

вы можете найти ответ в исходном коде: frameworks\base\core\res\res\values\dimens.xml

person xiaoyuan hu    schedule 12.12.2016
comment
есть ли способ получить этот ресурс в наших XML? @android:dimen/status_bar_height у меня не работает - person avalancha; 17.04.2020

Чтобы решить эту проблему, я использовал комбинированный подход. Это необходимо, так как на планшетах системная панель уже вычитает свои пиксели при вызове display.getHeight(). Поэтому я сначала проверяю, присутствует ли системная панель, а затем подходит Бен Клейтон, который отлично работает на телефонах.

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;
}
person Rutger    schedule 16.06.2013

Благодаря @Niklas +1 это правильный способ сделай это.

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

Пожалуйста, извините меня, если код не на 100% правильный, преобразовал его из Xamarin C#, но это только его. Работает с вырезами и т. д.

person Pierre    schedule 20.05.2019

Переключенное полноэкранное решение:

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

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

Таким образом, если ваше приложение сейчас полноэкранное, barheight будет равно 0.

Лично мне пришлось использовать это, чтобы исправить абсолютные координаты TouchEvent для учета строки состояния следующим образом:

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

И это получит абсолютную координату y, независимо от того, является ли приложение полноэкранным или нет.

Наслаждаться

person Aaron Gillion    schedule 07.04.2015
comment
Спасибо, это было единственное решение, которое сработало для меня, когда отображается клавиатура Android. - person Thiago Moura; 25.08.2016

Причина, по которой лучший ответ не работает для некоторых людей, заключается в том, что вы не можете получить размеры представления, пока оно не будет готово к рендерингу. Используйте OnGlobalLayoutListener, чтобы получить указанные размеры, когда вы действительно можете:

@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
        }
    }
}

Это самый надежный метод.

person user1112789    schedule 29.02.2016
comment
@androiddeveloper OnGlobal != GlobalOn - person marijnz0r; 18.08.2016
comment
@ marijnz0r Как странно. Что с этим делать? - person android developer; 18.08.2016
comment
@androiddeveloper Я не знаю, но я думал так же, как и вы, несколько дней назад. См.: stackoverflow.com/a/19216041/4587214 - person marijnz0r; 19.08.2016
comment
@ marijnz0r Оба делают то же самое. Напоминает мне о других случаях, когда они давали новое имя уже существующему материалу и объявляли устаревшим предыдущее. Пример fill_parent vs match_parent : developer.android.com/reference/android/view / - person android developer; 20.08.2016
comment
это должен быть принятый ответ! Спасибо! - person Qazi Fahim Farhan; 18.04.2021

В Android 4.1 и более поздних версиях вы можете настроить отображение содержимого вашего приложения за строкой состояния, чтобы размер содержимого не изменялся при скрытии и отображении строки состояния. Для этого используйте SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN. Вам также может понадобиться использовать SYSTEM_UI_FLAG_LAYOUT_STABLE, чтобы помочь вашему приложению поддерживать стабильный макет.

Когда вы используете этот подход, вы несете ответственность за то, чтобы важные части пользовательского интерфейса вашего приложения (например, встроенные элементы управления в приложении Карты) не закрывались системными панелями. Это может сделать ваше приложение непригодным для использования. В большинстве случаев вы можете справиться с этим, добавив атрибут android:fitsSystemWindows в файл макета XML со значением true. Это регулирует заполнение родительской ViewGroup, чтобы оставить место для системных окон. Этого достаточно для большинства приложений.

Однако в некоторых случаях вам может потребоваться изменить заполнение по умолчанию, чтобы получить желаемый макет для вашего приложения. Чтобы напрямую управлять тем, как ваш контент располагается относительно системных полос (которые занимают пространство, известное как «вставки содержимого окна»), переопределите fitSystemWindows(Rect insets). Метод fitSystemWindows() вызывается иерархией представления, когда вставки содержимого для окна изменились, чтобы позволить окну соответствующим образом скорректировать свое содержимое. Переопределяя этот метод, вы можете обрабатывать вставки (и, следовательно, макет вашего приложения) так, как хотите.

форма: https://developer.android.com/training/system-ui/status.html#behind

person xiaoyuan hu    schedule 11.09.2017

Если вы точно знаете размер VS рост

как

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

тогда вы можете просто получить ширину вашего представления/размер экрана, вы можете просто использовать оператор if else, чтобы получить высоту строки состояния

person Steven Shih    schedule 17.10.2010
comment
По моему опыту, высота зависит от плотности, а не от размера экрана. Конечно, плотность сама по себе обычно связана с размером экрана, так что существует косвенная связь. Мой старый Moto Droid, например, имеет дисплей с разрешением 480x854 (а не 480x800), а высота строки состояния также составляет 38 пикселей. - person Carl; 27.05.2012
comment
Для этого придумали dp (пиксели, не зависящие от плотности) - person Roel; 29.10.2014

Поскольку теперь доступен многооконный режим, у вашего приложения может не быть строки состояния вверху.

Следующее решение автоматически обрабатывает все случаи для вас.

android:fitsSystemWindows="true"

или программно

findViewById(R.id.your_root_view).setFitsSystemWindows(true);

вы также можете получить root-вид

findViewById(android.R.id.content).getRootView();
or
getWindow().getDecorView().findViewById(android.R.id.content)

Для получения более подробной информации о получении root-view см. https://stackoverflow.com/a/4488149/9640177

person mayank1513    schedule 07.03.2020

Этот вопрос недавно стал для меня актуальным из-за выреза в моем Pixel 3XL. Мне очень понравилось решение разработчика Android, но я хотел иметь возможность получать высоту строки состояния по желанию, так как это было специально необходимо для полноэкранной анимации, которую мне нужно было воспроизвести. Функция ниже включила надежный запрос:

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

А затем в классе активности:

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

Вы, конечно, захотите передать слабую ссылку активности в параметр статического метода класса Helper, но для краткости я воздержался в этом примере. blurBitmap и errorHudFrameLayout опущены по той же причине, поскольку они не имеют прямого отношения к получению высоты строки состояния.

person James Jordan Taylor    schedule 01.11.2018
comment
Если это для Android P и выше, зачем проверять Android M? Кроме того, что бы вы сделали, если бы у вас не было экземпляра View? Например, если у вас нет активности в настоящее время... - person android developer; 05.12.2018
comment
M — это самое раннее, что вы можете проверить stableInsetTop, и хотя только P поддерживает надрезы, я бы предпочел, чтобы фактическая вставка была возможна, а не возвращалась к умолчанию, где я могу. Это решение не работает, если у вас нет активности. - person James Jordan Taylor; 05.12.2018
comment
Я понимаю. Спасибо. Не могли бы вы показать более полный пример? - person android developer; 05.12.2018
comment
Я изменил свой ответ выше, чтобы использовать метод в примере. - person James Jordan Taylor; 09.12.2018