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

332

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

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

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

hpique
источник
Если вы делаете перекрестное затухание, вам не нужно знать высоту строки состояния.
stealthcopter
2
Мне это нужно, потому что некоторые элементы сосредоточены в макете, и я бы хотел, чтобы они плавно переходили друг в друга.
hpique
возможно дублирование высоты строки состояния?
Молнарм

Ответы:

363

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

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

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

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

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

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;
} 
Jorgesys
источник
Не совсем. Я также спрашиваю, могу ли я предположить, что строка состояния имеет одинаковую высоту на всех устройствах.
hpique
16
Или использовать провал? Если он всегда имеет 25dip, то код не нужен.
hpique
8
Вы не можете предполагать, что это всегда 25dp (проверьте высоту, например, при разжигании огня).
DallinDyer
1
Не работает в runnable, переданном в view.post () в onCreate () - возвращает 0
Ixx
4
window.getDecorView().getWindowVisibleDisplayFrame(rectangle)неверный способ получить высоту строки состояния, если вы находитесь в многооконном режиме + портретное вращение + второе окно. Вы получите огромное значение (включая 1-ую высоту).
Туан Чау
211

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

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

Бен Клейтон
источник
Вместо жесткого кодирования, лучше рассчитать динамически. Вышеуказанный метод работал для меня!
алхимик
не следует ли вместо этого использовать getDimension (...)?
Android-разработчик
6
Слово предостережения - это работает не на всех устройствах. Например, на Transformer TF201 (а также на TF101, TF300 и некоторых других устройствах) высота указывается как 25, если строка состояния отсутствует.
Błażej Czapp
4
Исходя из приведенных выше комментариев, мне кажется, что код говорит вам, какая высота строки состояния на конкретном устройстве, а не на какой-то конкретной деятельности (которая может не иметь строки состояния).
ошеломлен
в XML может быть использован размерный ресурс "@android: dimension / status_bar_height". <! - Высота строки состояния, определенной в исходном файле системы Android -> <измерение имени = "status_bar_height"> 24 дп </ измерения>. Но вы не можете напрямую ссылаться на него в своем проекте приложения. Поэтому вы должны использовать код.
Чангли
48

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

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

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

Grantland Chew
источник
6
Это верно для устройств, которые имеют строку состояния. Обратите внимание, что, поскольку выше было написано, оказалось, что не все устройства будут иметь один. В частности, устройства, работающие с ICS, могут иметь комбинированную строку состояния / навигации внизу и вообще ничего в верхней части. Таким образом, для этого случая, для большинства целей программирования, вы бы хотели присвоить нулевую высоту строке состояния, но приведенная выше формулировка даст вам ненулевой размер.
Карл
1
Также значение 25px не является правильным для всех устройств с mdpi. Это может варьироваться в зависимости от уровня API. Например, устройство эмулятора планшета 10.1 WXGA сообщает о 25 пикселях при API 16 и 19, но 24
пикселях
48

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

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

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

Никлас
источник
Это самый точный ответ сегодня
Кит
для меня это срабатывает только один раз, если у меня есть фрагменты через нижнюю навигацию. Если я снова заменю фрагмент, этот слушатель не будет вызван, есть ли компатер-геттер?
urSus
74
И все же этот API ужасен, потому что количество WTF / Gotchas за кулисами огромно. Вы могли бы подумать, что можете сделать это с любым представлением, но нет, вам нужно переопределить определенные вещи и убедиться, что ВЫ передаете вставки своим детям (??), потому что НЕКОТОРЫЕ ViewGroups будут (материальный дизайн), а ВСЕ ДРУГИЕ - ( линейный макет? ConstraintLayout? привет?). Вместо того, чтобы система имела Window.getStatusBarSize ()… мы должны ПОДПИСАТЬСЯ НА БЕСПЛАТНЫЙ СЛУШАТЕЛЬ… иди домой на Android, ты пьян. Просто закодируйте размер, пока Google не проснется, мы в 2018 году. Надеюсь, Крис Бейнс увидит это однажды ...
Мартин Маркончини,
В моем случае это не увольнение. Я поставил это Activity # onCreated. Я сделал что-то не так? Кроме того, почему мы не используем mView.getRootWindowInsets ()?
Адиль Алиев
34

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

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

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

Согласно руководству по дизайну Google ; высота строки состояния 24 дп.

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

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

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

statusBarHeight(getResources());
Рашид
источник
18
До Зефира это было 25dp. С Зефира это 24dp.
Евгений Печанец
1
это, по существу , жестко прописывать значение - которое не позволяет для изменения дизайна
siliconeagle
1
и не учитывает тот факт, что строка состояния не будет отображаться в тех же случаях
jk7
19

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

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

crysxd
источник
1
сладкий! Я только что создал размерs.xml специально для API уровня 23+, где я жестко прописал высоту 24dp.
Кто-то где-то
18

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

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

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

benhylau
источник
3
Мне нравится ваша идея использования значений, основанных на плотности. Если вы собираетесь использовать код в нескольких местах (или использовать другие значения, связанные с плотностью), я предпочитаю перенести работу в систему и сохранить значения в ресурсе измерения, что делает ненужным переключение. Вам необходимо создать папку для конкретного размера и файл ресурсов для каждой плотности. окончательные ресурсы res = context.getResources (); int statusbarHeight = 0; try {statusbarHeight = res.getDimensionPixelSize (R.dimen.android_statusbar_height); } catch (NotFoundException e) {}
ProjectJourneyman
5
Жесткое кодирование этих значений опасно, что если они изменятся в более поздней версии платформы?
Дэвид Снабел-Каунт
Я думаю, что вместо использования жестко закодированных размеров пикселей (по одному для каждой плотности) лучше использовать «25dp».
Android-разработчик
12

Да, когда я пытаюсь сделать это с помощью 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);
            }
        }
    }
}
Braj
источник
Приведенный выше код работает для меня, когда я создаю новый линейный макет, как вы сделали выше, но когда я делаю findviewbyid для lySpin из XML. тогда он возвращает ноль. не понимая, что он ведет себя так.
Шайста Нааз
Поскольку макет еще не знает своего размера в onCreate, потому что он еще не закончил отрисовку. Что я обычно делаю, это публикую Runnable в потоке пользовательского интерфейса из onCreate, который дает пользователю время рисовать себя.
Джейсон Робинсон
8

240x320 - 20 пикселей

320x480 - 25 пикселей

480x800 + - 38px

Денис
источник
3
Это уже не точно. Используйте метод измерения строки состояния.
Майкл
7

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

    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

Martyn
источник
Я подозреваю, что на момент тестирования в onCreate () строка состояния еще не была создана. Напротив, когда он щелкнул вручную, чтобы активировать свой код onClickListener (), у панели уже было достаточно времени для размышлений, и он смог получить ее размер.
Карл
6

высота строки состояния в Android 6.0 24dp

 <!-- 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 ​​\ dimensions.xml

сяоюань ху
источник
Есть ли способ получить этот ресурс в наших XML? @android:dimen/status_bar_heightу меня не работает
Патрик
4

Чтобы решить эту проблему, я использовал комбинированный подход. Это необходимо, поскольку на планшетах системная панель уже вычитает свои пиксели при вызове 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;
}
Рутгер
источник
3

Благодаря @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 #, но это как раз то, что нужно. Работает с надрезами и т. Д.

пьер
источник
2

Toggled Fullscreen Solution:

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

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 независимо от того, будет ли приложение полноэкранным или нет.

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

Аарон Джиллион
источник
Спасибо, это было единственное решение, которое работало для меня, когда клавиатура Android показывает тоже.
Тьяго Моура
2

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

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

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

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

сяоюань ху
источник
1

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

лайк

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

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

Стивен Ши
источник
По моему опыту, высота, кажется, основана на плотности, а не на размере экрана. Конечно, сама плотность обычно связана с размером экрана, поэтому существует косвенная зависимость. Например, мой старый Moto Droid имеет дисплей 480x854 (а не 480x800), а строка состояния также имеет высоту 38 пикселей.
Карл
Они изобрели дп для этого (независимые от плотности пиксели)
Роэл
1

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

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

user1112789
источник
1
@androiddeveloper OnGlobal! = GlobalOn
marijnz0r
@ marijnz0r Как странно. Что за дело с этим?
Android-разработчик
@androiddeveloper Не знаю, но я тоже так думал, как и несколько дней назад. См .: stackoverflow.com/a/19216041/4587214
marijnz0r
@ marijnz0r Так что оба делают то же самое. Напоминает мне о других случаях, что они дали новое имя для материала, который уже существовал, и осудили предыдущий. Пример "fill_parent" против "match_parent": developer.android.com/reference/android/view/…
разработчик Android
1

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

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

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-представления см. Https://stackoverflow.com/a/4488149/9640177.

mayank1513
источник
0

Этот вопрос недавно стал актуальным для меня из-за выемки в моем 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опускаются по той же причине, поскольку они не имеют прямого отношения к получению высоты строки состояния.

Джеймс Джордан Тейлор
источник
Если это для Android P и выше, зачем проверять с Android M? Кроме того, что бы вы сделали, если у вас нет экземпляра View? Например, если у вас нет Activity в настоящее время ...
Android-разработчик
M - самое раннее, что вы можете проверить stableInsetTop, и даже если только P поддерживает метки, я бы предпочел получить фактическую вставку вместо того, чтобы вернуться к значениям по умолчанию, где я могу. Это решение не работает, если у вас нет активности.
Джеймс Джордан Тейлор
Понимаю. Спасибо. Можете ли вы показать более «полный» пример?
Android-разработчик
Я изменил свой ответ выше, чтобы использовать метод в примере.
Джеймс Джордан Тейлор
0

Версия 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нет, вычисляет высоту строки состояния из окна Декор
tomrozb
источник