Как получить высоту строки состояния и кнопок софт-клавиш?

Есть ли способ в Android, чтобы получить размер панели софт-кнопок и тогетер строки состояния? или способ получить высоту экрана без высоты обеих этих полос? (они не всегда одинаковы, посмотрите на Nexus 7 например)

5 ответов

Решение

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

Высота строки состояния зависит от размера экрана, например, в устройстве с размером экрана 240 x 320 высота строки состояния составляет 20 пикселей, для устройства с размером экрана 320 x 480 высота строки состояния составляет 25 пикселей, для устройства с 480 x 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("*** Value :: ", "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;
} 

Панель кнопок Soft Key

Этот метод очень полезен для установки отступов макета в Android KitKat (4.4). Используя это, вы можете избежать перекрытия панели программных кнопок над макетом.

getRealMetrics метод доступен только с API 17 и +

@SuppressLint("NewApi")
private int getSoftButtonsBarHeight() {
    // getRealMetrics is only available with API 17 and +
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        int usableHeight = metrics.heightPixels;
        getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
        int realHeight = metrics.heightPixels;
        if (realHeight > usableHeight)
            return realHeight - usableHeight;
        else
            return 0;
    }
    return 0;
}

Ссылка:

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

Размер панели софт-кнопок

Для меня, в примечании к Android 10, мне нужно получить высоту панели навигации по размеру:

fun getSoftNavigationBarSize(resources: Resources): Int {
    var result = 0
    val resourceId: Int = resources.getIdentifier("navigation_bar_height", "dimen", "android")
    if (resourceId > 0) {
        result = resources.getDimensionPixelSize(resourceId)
    }
    return result
}

Я хотел бы добавить еще один способ к ответу @Adrian Cid Almaguer, поскольку я хотел получить высоту строки состояния в фоновой службе.

      val windowService = context.getSystemService(Context.WINDOW_SERVICE)
(windowService as WindowManager).apply {
   val statusBar = currentWindowMetrics.windowInsets.getInsets(WindowInsets.Type.statusBars())
   val statusBarHeight = statusBar.top
}

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

      var navBarHeight = 0
val navBar = currentWindowMetrics.windowInsets.getInsets(WindowInsets.Type.navigationBars())
when {
  (navBar.bottom > 0) -> navBarHeight = navBar.buttom
  (navBar.right > 0) -> navBarHeight = navBar.right 
  (navBar.left > 0) -> navBarHeight = navBar.left 
 }

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

      view.rootWindowInsets?.let { inset ->
    Log.e("XXX", "button bar height: ${inset.systemWindowInsetBottom}")
}

Примечание: вам нужен вид, который прикреплен к окну в это время.

       private void getStatusAndNavigationBarsHeight() {
        float deviceDensity = getResources().getDisplayMetrics().density;
        float statusHeight = 0;
        float navigationHeight = 0;
        Resources myResources = getApplicationContext().getResources();

        int idStatusBarHeight = myResources.getIdentifier( "status_bar_height", "dimen", "android");
        statusHeight = idStatusBarHeight > 0 ? getResources().getDimensionPixelSize(idStatusBarHeight)/deviceDensity : 0;
        statusHeight = Math.round(statusHeight);
        Log.d("StatusBar Height(dp):", String.valueOf(statusHeight));

        int idNavigationBarHeight = myResources.getIdentifier("navigation_bar_height", "dimen", "android");
        navigationHeight = idNavigationBarHeight > 0 ? getResources().getDimensionPixelSize(idNavigationBarHeight)/deviceDensity : 0;
        navigationHeight = Math.round(navigationHeight);
        Log.d("Navigation Bar Height(dp):", String.valueOf(navigationHeight));
    }
Другие вопросы по тегам