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


332

Яка висота рядка стану в Android? Це завжди те саме?

З моїх вимірювань здається, що це 25dp, але я не впевнений, чи має він однакову висоту на всіх платформах.

(Я хочу знати це, щоб належним чином здійснити невдалий перехід від діяльності, яка не має рядка стану, до тієї, що робить)


Якщо ви перехрещуєтесь, то вам не потрібно знати висоту смуги стану.
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;
} 

Не зовсім. Я також запитую, чи можу я припустити, що рядок стану має однакову висоту на всіх пристроях.
hpique

16
Або використовувати dip? Якщо він завжди має 25dip, код не потрібен.
hpique

8
ви не можете припустити, що це завжди 25dp (перевірити висоту, наприклад, на вогні розпалу).
DallinDyer

1
Не працює в запущеному вигляді, переданому view.post () в onCreate () - повернення 0
Ixx,

4
window.getDecorView().getWindowVisibleDisplayFrame(rectangle)не є правильним способом отримати висоту рядка стану, якщо ви перебуваєте в режимі з кількома вікнами + обертання портрета + друге вікно. Ви отримаєте величезне значення (включіть 1-ю висоту).
Туан Чау

211

З усіх зразків коду, який я використав, щоб отримати висоту рядка стану, єдиний, який фактично працює у 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класу (наприклад, an Activity).

Знайдено на веб- сайті http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/


Замість жорсткого кодування це краще розрахувати динамічно. Вищеописаний метод працював для мене!
алхімік

чи не слід використовувати замість getDimension (...)?
андроїд розробник

6
Слово обережності - це працює не на всіх пристроях. Наприклад, у трансформатора TF201 (а також у TF101, TF300 та деяких інших пристроях) висота повідомляється як 25, де немає рядка стану.
Błażej Czapp

4
На підставі вищезазначених коментарів, мені здається, що код говорить вам про те, яка висота рядка стану на певному пристрої - а не те, що знаходиться в певній діяльності (яка насправді може не мати рядка стану).
замаяв

в XML може бути використаний ресурсний параметр "@android: dimen / status_bar_height". <! - Висота рядка стану, визначеного у вихідному файлі системної системи Android -> <dimen name = "status_bar_height"> 24dp </dimen>. Але ви не можете направити його на ваш проект програми. Отже, ви повинні використовувати код.
Чжунлі

48

На пристроях MDPI рядок стану становить 25 пікселів. Ми можемо використовувати це в якості основи і помножити його на щільність (округлену вгору), щоб отримати висоту рядка стану на будь-якому пристрої:

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

Для довідки: ldpi = .75, mdpi = 1, hdpi = 1.5, xhdpi = 2


6
Це правильно для пристроїв, які мають рядок стану. Зауважте, що оскільки було написано вище, стало правдою, що не всі пристрої матимуть його. Зокрема, пристрої під управлінням ICS можуть мати комбіновану смугу стану / навігації внизу і зовсім нічого вгорі. Тож для цього випадку для більшості цілей програмування ви хочете призначити висоту нуля до рядка стану, але вищевказана формулювання дасть вам ненульовий розмір.
Карл

1
Також значення 25px невірно для всіх пристроїв mdpi. Він може змінюватися залежно від рівня API. Наприклад, емулятор планшетного ПК 10.1 WXGA повідомляє 25px в API 16 та 19, але 24px в API 24.
jk7

48

Жорстке кодування розміру або використання відображення для отримання значення status_bar_heightвважається поганою практикою. Кріс Бейнс розповів про це в Droidcon Нью-Йорку . Рекомендований спосіб отримання розміру рядка стану - через 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 році. Сподіваюся, Кріс Бейнс побачить це одного дня…
Мартін Марконніні

У моєму випадку його не звільняють. Я ставлю це Активність # onCreate. Я щось не так зробив? Крім того, чому ми не використовуємо 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();
        }
    });

EDIT: Альтернатива запускуJustBeforeBeingDrawn: https://stackoverflow.com/a/28136027/878126


getResources (). getDisplayMetrics (). висотаPixels -getActivity (). findViewById (android.R.id.content) .getMeasuredHeight () не працює в android lolipop
abbasalim

@ ArMo372 Оновлена ​​відповідь. Просто погляд повинен спочатку пройти вимірювання. Вам не потрібно використовувати runJustBeforeBeingDrawn, якщо ви вже пройшли його. Ви будете використовувати його лише в занадто ранніх випадках.
андроїд розробник

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.

Оновлення. Зверніть увагу: з моменту початку епізодів висічок та перфораторів, використання статичної висоти для рядка стану вже не працює. Будь ласка, замість цього використовуйте вставки вікон!


1
солодкий! Щойно я створив dimens.xml спеціально для API рівня 23+, де я жорстко кодував висоту як 24dp.
Хтось десь

18

це також працює за посиланням refrence

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


3
Мені подобається ваша ідея використання значень, керованих щільністю. Якщо ви збираєтесь використовувати код у декількох місцях (або використовувати інші значення, пов’язані з щільністю), я вважаю за краще вивантажувати роботу в систему та зберігати значення в ресурсі розміру, що робить перемикання непотрібним. Вам потрібно створити папку та файл ресурсів для кожної щільності. final Resources res = context.getResources (); int statusbarHeight = 0; спробуйте {statusbarHeight = res.getDimensionPixelSize (R.dimen.android_statusbar_height); } лов (NotFoundException e) {}
ProjectJourneyman

5
Жорстке кодування цих значень небезпечно, а якщо вони зміниться у більш пізній версії платформи?
Девід Снабель-Конт

Я думаю, що замість того, щоб використовувати жорстко кодовані розміри пікселів (по одному для кожної щільності), краще використовувати "25dp".
андроїд розробник


12

Так, коли я спробую це з View, він дає результат у 25 пікселів. Ось весь код:

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

Вищевказаний код працює для мене, коли я створюю новий лінійний макет, як ви робили вище, але коли я шукаю viewviewbyid для lySpin з xml. тоді він повертається до нуля. не розуміючи y, він так поводиться.
Шаїста Нааз

Оскільки макет ще не знає свого розміру в onCreate, тому що він не закінчив малювати. Що я зазвичай роблю, це розміщувати Runnable на потоці інтерфейсу від onCreate, який дає користувальницький час малювати себе.
Джейсон Робінсон

8

240x320 - 20 пікселів

320x480 - 25 пікселів

480x800 + - 38 пікселів


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


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

6

висота рядка стану 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


чи є спосіб отримати цей ресурс у наших 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

Вирішення на весь екран:

Це рішення може виглядати як вирішення, але насправді пояснюється, чи є ваш додаток повноекранним (він же приховує рядок стану) чи ні:

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

І це отримає абсолютну координату у, чи програма буде повноекранною, чи ні.

Насолоджуйтесь


Дякую, це було єдиним рішенням, яке працювало для мене, коли андроїдна клавіатура також показує.
Тіаго Моура

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 має дисплей 480х854 (а не 480х800), а рядок стану - також 38 пікселів.
Карл

Вони винайшли для цього dp (незалежні від щільності пікселі)
Roel

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

Це найнадійніший метод.


1
@androiddeveloper OnGlobal! = GlobalOn
marijnz0r

@ marijnz0r Як не дивно. Яка угода з цим?
андроїд розробник

@androiddeveloper Я не знаю, але мені трапилося так само, як і ти кілька днів тому. Див: stackoverflow.com/a/19216041/4587214
marijnz0r

@ marijnz0r Отже, обидва роблять те саме. Нагадує мені про інші випадки, що вони дали нову назву речі, яка вже існувала, і знехтували попередню. Приклад "fill_parent" vs "match_parent": developer.android.com/reference/android/view/…
андроїд розробник

1

Оскільки зараз доступний режим з декількома вікнами, у вашій програмі може не бути панелі стану вгорі.

Наступне рішення вирішує всі справи автоматично для вас.

android:fitsSystemWindows="true"

або програмно

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

ви також можете отримати перегляд кореневих файлів від

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

Більш детальну інформацію про отримання кореневого перегляду див. На https://stackoverflow.com/a/4488149/9640177


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? Наприклад, якщо у вас зараз немає активності ...
андроїд розробник

М - це найдавніше, що ви могли перевірити стабільний InsetTop, і навіть незважаючи на те, що лише P підтримує виїмки, я можу отримати фактичну вкладку, а не повертатися до дефолту, де можу. Це рішення не працює, якщо у вас немає активності.
Джеймс Джордан Тейлор

Розумію. Дякую. Чи можете ви, будь ласка, показати більш "повний" приклад?
андроїд розробник

Я змінив свою відповідь вище, щоб використати метод у прикладі.
Джеймс Джордан Тейлор

0

Версія Котліна, що поєднує в собі два найкращих рішення

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немає, обчислює висоту рядка стану від декору Вікна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.