Android: получить размер экрана только для корневого макета - PullRequest
2 голосов
/ 09 января 2012

Пожалуйста, поймите меня правильно здесь:

Я хочу получить высоту / ширину пространства, доступного для Activity / Layout, в методе onCreate (), чтобы вычислить высоту, которая может быть задана дочерним макетам. Я могу получить размер экрана, используя:

      root = (LinearLayout) findViewById(R.id.mainroot); // Main layout of LinearLayout  

       android.view.Display display = getWindowManager().getDefaultDisplay();
    int height = Display.getHeight(); // I know this is deprecated have hence used 
      int width = Display.getWidth(); // DisplayMetrics
    int childWidth, childHeight;

    DisplayMetrics metrics = new DisplayMetrics();
    display.getMetrics(metrics);
    //int density = metrics.densityDpi;
    height = metrics.heightPixels;  //480
    width = metrics.widthPixels;    //320

Это оба метода / способа дают мне одинаковую высоту и ширину, то есть размер полного экрана. То, что я ищу, - это получить фактическую высоту, которая может быть указана для макета, после вычета заголовка приложения, строки состояния и т. Д.

Есть идеи, как это получить. ИЛИ, чтобы получить размеры заголовков и т. Д. - что все должно быть посчитано здесь. На эмуляторе я вижу 2 столбца сверху - 1 должен быть титул приложения, как и другой. Я могу получить высоты их всех и вычесть из высоты экрана.

Еще один момент: в этом случае я буду устанавливать высоту программно, поэтому она будет основываться на пикселях (так как я могу устанавливать высоту только в пикселях), что повлияет на коэффициент плотности при разных размерах экрана. Что может быть способом для расчета высоты (скажем, 50%) для дочернего макета, который будет одинаковым для любой плотности, так что

Ответы [ 2 ]

2 голосов
/ 09 января 2012

РЕШЕНИЕ:

В моем onCreate () я добавил следующие строки:

    setContentView(R.layout.mainpage);

    root = (LinearLayout) findViewById(R.id.mainroot);    
    root.post(new Runnable() {
        public void run() {
            Rect rect = new Rect();
            Window win = getWindow();
            win.getDecorView().getWindowVisibleDisplayFrame(rect);
            int statusHeight = rect.top;
            int contentViewTop = win.findViewById(Window.ID_ANDROID_CONTENT).getTop();
            titleHeight = contentViewTop - statusHeight;
            Log.i(Utility.TAG, "titleHeight = " + titleHeight + " statusHeight = " + statusHeight + " contentViewTop = " + contentViewTop);

            // CALCULATE THE SIZE OF INNER LAYOUTS
            calculateChildSize();
        }
    });

С помощью приведенного выше кода я получаю значения titleBar и statusBar. Вычитая его из metrics.heightPixels;, я получаю необходимую высоту экрана.

Хорошо, этот код работает для всех плотностей.

Надеюсь, это поможет и другим.

ДЛЯ УЛУЧШЕНИЯ: Я должен делать подобные вычисления для всех Деятельностей в моем приложении, поэтому думал о написании этого кода только один раз. Я могу сохранить titleHeight в статическую переменную, чтобы использовать ее во всех действиях. НО

Может ли пользователь изменять плотность телефона во время выполнения. Если это так, то onCreate Activity будет вызываться снова или нет? Если нет, то я могу перехватить событие изменения плотности, где я могу добавить этот код и обновить текущее действие.

Любая идея предложения по улучшению приветствуется.

0 голосов
/ 09 января 2012

// Где rootView - это объект для корневого представления вашего приложения. Final int viewWidt = rootView.getMeasuredWidth ();

...