Высота экрана без строки состояния, actionBar и вкладок

У меня есть ListView, который я хочу, чтобы каждая строка заполнила треть доступного экрана. У меня есть индикатор состояния, а затем actionBar с slideTabs внизу. Я делаю текущие вычисления следующим образом:

height = context.getResources().getDisplayMetrics().heightPixels;
if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
    {
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,context.getResources().getDisplayMetrics());
        Log.d("actionBarHeigth", actionBarHeight.toString());
    }

И установите высоту представлений следующим образом:

holder.imageView.getLayoutParams().height = (height - actionBarHeight*2) / 3;

Но строки списка немного слишком велики, и я предполагаю, что строка состояния вызывает его. Как добавить его к моим вычислениям?

Ответ 1

Основываясь на ответе @rasmeta, я сделал этот код, и он делает трюк. Мои ряды теперь составляют ровно треть доступного экрана. Вот как получить высоту строки состояния:

int resource = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resource > 0) {
        statusBarHeight = context.getResources().getDimensionPixelSize(resource);
    }

И вычисление высоты каждой строки выглядит следующим образом:

holder.imageView.getLayoutParams().height = (screenHeight - statusBarHeight - actionBarHeight*2) / 3;
// actionBarHeight * 2 because the tabs have the same height as the actionBar.

Ответ 2

Вы можете использовать этот код:

public int getStatusBarHeight() { 
      int result = 0;
      int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
      if (resourceId > 0) {
          result = getResources().getDimensionPixelSize(resourceId);
      } 
      return result;
}

как описано здесь: fooobar.com/questions/27720/...

Попробуйте использовать это решение и сообщите нам, если он сработает.;)

Ответ 3

Самый простой способ:

int height = findViewById(R.id.rootView).getHeight();

rootView - это макет главного корня:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rootView"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
      ...
</LinearLayout>