Высота строки состояния в Android - PullRequest
302 голосов
/ 04 августа 2010

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

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

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

Ответы [ 21 ]

12 голосов
/ 28 января 2011

Да, когда я пробую его с помощью 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);
            }
        }
    }
}
9 голосов
/ 18 ноября 2010

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

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

480x800 + - 38 пикселей

6 голосов
/ 04 августа 2010

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

    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

5 голосов
/ 12 декабря 2016

высота строки состояния 24дп в андроиде 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 ​​\ dimensions.xml

4 голосов
/ 17 июня 2013

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

В 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

2 голосов
/ 08 апреля 2015

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

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

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

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

1 голос
/ 20 мая 2019

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

1 голос
/ 18 октября 2010

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

как

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

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

1 голос
/ 29 февраля 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
        }
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...