Настройка динамического размера макета в Android - PullRequest
5 голосов
/ 31 августа 2011

В Деятельности с большим количеством компонентов у меня есть RelativeLayout, который содержит WebView (он просто показывает TextView, размер которого я не знаю).

Это код xml:

<RelativeLayout android:id="@+id/descripcionRelative" android:layout_below="@+id/descripcion_bold" android:layout_width="match_parent" android:layout_height="125dip" android:background="@drawable/my_border">
    <WebView android:id="@+id/webViewDescripcion" android:layout_width="wrap_content" android:layout_height="wrap_content"/>      
</RelativeLayout>

Атрибут android: layout_height для RelativeLayout равен 125dip, потому что, если текст слишком большой, я хочу ограничить до 125dip.Если текст большой, я увижу текст с прокруткой.Отлично!

Но ... если текст короткий, я вижу много ненужного места.

Одним из решений является изменение android: layout_height RelativeLayout на wrap_content.Если текст короткий, у компонента будут точные пиксели, но если текст слишком большой, я не могу его разграничить.

БОЛЬШАЯ ПРОБЛЕМА заключается в том, что я не могу рассчитать высоту WebView.Если я это сделаю: descripcion_web.getHeight (), он вернет 0.

Если я вызову этот метод здесь, он не вернет правильное число:

descripcion_web.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView webView, String url) {
            super.onPageFinished(webView, url);
            RelativeLayout marco = (RelativeLayout)findViewById(R.id.descripcionRelative);
            System.out.println("Height webView: "+webView.getHeight());   
            System.out.println("Height relative: "+marco.getHeight());            
        }           
    });

Я пытаюсь вызвать его вметод в onResume (), но он не работает.

Еще одна попытка решить проблему - установить для android: layout_height значение match_parent и использовать метод View setMaximumHeight (), но он не существует.Тем не менее, он существует setMinimumHeight () ...

Как я могу решить эту проблему?Большое спасибо!

1 Ответ

7 голосов
/ 11 декабря 2011

К сожалению, для большинства представлений Android нет стандартного «setMaximumHeight».Но вы можете реализовать такое наследование от WebView.Вот пример, как вы можете сделать это:

package com.am.samples.maxheight;

import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebView;

public class CustomWebView extends WebView {

    private int maxHeightPixels = -1;

    public CustomWebView(Context context, AttributeSet attrs, int defStyle,
            boolean privateBrowsing) {
        super(context, attrs, defStyle, privateBrowsing);
    }

    public CustomWebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public CustomWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomWebView(Context context) {
        super(context);
    }

    public void setMaxHeight(int pixels) {
        maxHeightPixels = pixels;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (maxHeightPixels > -1 && getMeasuredHeight() > maxHeightPixels) {
            setMeasuredDimension(getMeasuredWidth(), maxHeightPixels);
        }
    }
}

Надеюсь, это поможет!

...