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



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



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



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

755   19  

19 ответов:

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

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

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

ОК, высота строки состояния зависит от размера экрана, например в устройстве с разрешение 240 x 320 размер экрана статус бар высота 20 пикселей, для устройства с размером 320 x 480 экран статус бар высота-25 пикселей, для устройств с разрешением 480 х 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;
} 

из всех примеров кода, которые я использовал, чтобы получить высоту строки состояния, единственный, который на самом деле работает в onCreate метод an 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 устройств, в строке состояния-25 пикселей. Мы можем использовать это в качестве основы и умножить его на плотность (округленный вверх), чтобы получить высоту строки состояния на любом устройстве:

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

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

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

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

240x320-20px

320x480-25px

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() называется. Поэтому я сначала проверяю, присутствует ли системная панель, а затем подход Ben Claytons, который отлично работает на телефонах.

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

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

в некоторых случаях, однако, вам может потребоваться изменить заполнение по умолчанию, чтобы получить желаемый макет для вашего приложения. Чтобы напрямую манипулировать тем, как ваш контент выкладывается относительно системных панелей(которые занимают пространство, известное как "вставки содержимого" окна), переопределяют fitSystemWindows (Rect insets). Метод 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
        }
    }
}

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

Comments

    Ничего не найдено.