2011-08-31 12 views
5

En una actividad con muchos componentes, tengo un RelativeLayout que tiene un WebView (muestra un texto simple, que no conozco su tamaño).Ajuste del tamaño dinámico del diseño en Android

Este es el código 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> 

El androide atributo: layout_height de RelativeLayout es 125dip, porque si el texto es demasiado grande, quiero delimitar a 125dip. Si el texto es grande, veré texto con desplazamiento. ¡Estupendo!

Pero ... si el texto es corto, veo un montón de espacio innecesario.

Una solución es cambiar android: layout_height de RelativeLayout to wrap_content. Si el texto es corto, el componente tendrá los píxeles exactos, pero si el texto es demasiado grande, no puedo delimitarlo.

El PROBLEMA GRANDE es que no puedo calcular la altura de WebView. Si hago: descripcion_web.getHeight() que devuelve 0.

Si llamo a este método aquí, no devuelve el número así:

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());    
     }   
    }); 

Trato de llamar al método en onResume(), pero no funciona

Otro intento de resolver el problema, se establece android: layout_height para match_parent y utiliza un método View setMaximumHeight(), pero no existe. Sin embargo, existe setMinimumHeight() ...

¿Cómo puedo resolver esto? ¡Muchas gracias!

Respuesta

7

Desafortunadamente no existe un desfile "setMaximumHeight" para la mayoría de las vistas de Android. Pero puede implementar dicha herencia desde WebView. Aquí hay un ejemplo de cómo puedes hacer eso:

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); 
     } 
    } 
} 

Hope this helps!

Cuestiones relacionadas