Подтвердить что ты не робот

Надежность получения высоты строки состояния для решения проблемы прозрачной навигации KitKat

Я экспериментирую с новыми полупрозрачными навигационными панелями Android 4.4 и хотел бы настроить навигационную панель как полупрозрачную, используя флаг FLAG_TRANSLUCENT_NAVIGATION. Я хочу, чтобы панель навигации (back, home button и т.д.) Была полупрозрачной - я хочу, чтобы строка состояния в верхней части экрана отображалась нормально I.e. НЕ полупрозрачный.

Код, который я использую для этого:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    Window w = getWindow();
    w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}

Проблема, с которой я столкнулась, - это Android теперь думает, что Activity полноэкранный и помещает макет за панель навигации (что верно), к сожалению, это также помещает макет за панель состояния (проблема).

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

Может ли кто-нибудь предположить, как я получаю высоту строки состояния, это не так тривиально, как я думал, это будет или, альтернативно, предложить правильное решение.

Спасибо

4b9b3361

Ответ 1

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. Поместите его в класс contextWrapper. http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/

Ответ 2

Так как api 21 имеет официальный метод для извлечения вложений для строки состояния и высоты панели навигации, когда это полупрозрачный

ViewCompat.setOnApplyWindowInsetsListener(view, new OnApplyWindowInsetsListener() {
        @Override
        public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
            final int statusBar = insets.getSystemWindowInsetTop();
            final int navigationBar = insets.getSystemWindowInsetBottom();
            return insets;
        }
    });

Ответ 3

Высота нижней навигационной панели составляет 48 дп (как в портретном, так и в альбомном режимах) и составляет 42dp, когда панель помещается вертикально.

Надеюсь, что это поможет.

Ответ 4

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

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

public int getStatusBarHeight() {
    Rect displayRect = new Rect();
    getWindow().getDecorView().getWindowVisibleDisplayFrame(displayRect);
    return displayRect.top;
}

Обратите внимание, что вы также можете просто использовать displayRect напрямую, если у вас есть другие "декорации окон" внизу или потенциально даже на сторонах экрана.

Ответ 5

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

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