Android: настройка высоты кнопки в XML в зависимости от ее ширины - PullRequest
5 голосов
/ 15 октября 2010

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

Спасибо, Джош

Ответы [ 2 ]

3 голосов
/ 15 октября 2010

У меня когда-то была похожая проблема, и я не нашел решения, которое работает только из XML. Вы должны написать свой собственный Button-Class и переписать метод [onMeassure] [1].

Пример:

/**
 * @see android.view.View#measure(int, int)
 */
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
}

private int width; // saves the meassured width


/**
 * 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 = 30;
    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 =1123; // meassure your with here somehow
        if (specMode == MeasureSpec.AT_MOST) {
            // Respect AT_MOST value if that was what is called for by measureSpec
            result = Math.min(result, specSize);
        }
    }
            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 = width;
        if (specMode == MeasureSpec.AT_MOST) {
            // Respect AT_MOST value if that was what is called for by measureSpec
            result = Math.min(result, specSize);
        }
    }

    return result;
}

[1]: http://developer.android.com/reference/android/view/View.html#onMeasure(int, int)

0 голосов
/ 15 октября 2010

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

, например:android: textSize = "12dip"

Вы можете использовать dip или dp .

Наслаждайтесь !!

...