Как правильно размер, содержащий представления - PullRequest
0 голосов
/ 28 апреля 2010

У меня есть Activity, который будет отображать пользовательский вид, состоящий из 2 частей. Я хочу, чтобы одна часть была на 1/3 высоты видимого экрана, а другая - на 2/3.

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

DisplayMetrics dm = new DisplayMetrics(); 
((WindowManager)contxt.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(dm); 
int height = dm.heightPixels;

Как определить высоту отображаемой области? Я готов переопределить layout или что-то еще. Каковы лучшие практики Android? Я видел другие вопросы в этом направлении, но они неубедительны.

1 Ответ

1 голос
/ 28 апреля 2010

Я нашел способ сделать это. Я переопределяю RelativeLayout и заставляю его сохранять указатели на мой верхний и нижний представления Затем, когда он обрабатывает onMeasure, он устанавливает желаемую высоту для моих двух представлений. Они используют желаемую высоту, когда обрабатывают метод измерения. Это дает мне один вид в 2/3 видимой области, с другим ниже.

- из моего класса Layout

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // set default screen heights
    int heightSize = MeasureSpec.getSize(heightMeasureSpec);
    if ( upper != null )
        upper.setPrefHeight((heightSize*2)/3);
    if ( lower != null )
        lower.setPrefHeight(heightSize/3);

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

- из Просмотр производных классов

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(measureWidth(widthMeasureSpec),
            measureHeight(heightMeasureSpec));
}

/**
 * Determines the width of this view
 * @param measureSpec A measureSpec packed into an int
 * @return The width of the view, honoring constraints from measureSpec
 */
private int measureWidth(int measureSpec) {
    int result = 0;
    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize = MeasureSpec.getSize(measureSpec);

    if (specMode == MeasureSpec.EXACTLY) {
        // We were told how big to be
        result = specSize;
    } else {
        DisplayMetrics dm = new DisplayMetrics(); 
        ((WindowManager)contxt.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(dm); 
        result = dm.widthPixels; 
    }
    width = result;
    return result;
}

/**
 * Determines the height of this view
 * @param measureSpec A measureSpec packed into an int
 * @return The height of the view, honoring constraints from measureSpec
 */
private int measureHeight(int measureSpec) {
    int result = 0;
    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize = MeasureSpec.getSize(measureSpec);

    if (specMode == MeasureSpec.EXACTLY) {
        // We were told how big to be
        result = specSize;
    } else {
        result = prefHeight;
    }
    height = result;

    return result;
}
...