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

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

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

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

19 ответов


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

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

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

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

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

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

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


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

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

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


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

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

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

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

statusBarHeight(getResources());

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

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: альтернатива runJustBeforeBeingDrawn:https://stackoverflow.com/a/28136027/878126


это также работает с 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;
}

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

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

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


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


Да, когда я пробую его с видом, он предоставляет результат 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);
            }
        }
    }
}

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


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


240х320 - в 20px

320х480 - 25 пикселей

480x800+ - 38px


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

    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


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

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

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


Переключить Разрешение В Полноэкранном Режиме:

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

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

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

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

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


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

Как

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

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


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

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