Android establece la altura y el ancho de la vista personalizada mediante programación

128

He creado una vista personalizada llamada Graphview. Aquí está la estructura para la clase GraphView.

public class GraphView extends View {

    public GraphView(Context context, float[] values, String title, String[] horlabels, String[] verlabels, boolean type) {
        super(context);
                ........
   }

   ..................
   .................
}

He agregado la vista en una tabla usando addview(). Esta funcionando bien Ahora quiero establecer la altura y el ancho de GraphView. ¿Como hacer eso?

dev_android
fuente

Respuestas:

140

La manera fácil es establecer el tamaño mediante programación de esa manera:

graphView.setLayoutParams(new LayoutParams(width, height));

Esto está bien si conoce el tamaño exacto de la vista. Sin embargo, si desea un enfoque más flexible, puede anular el onMeasure()método para medir el punto de vista más precisamente en función de las limitaciones del espacio disponible y de la disposición ( wrap_content, match_parent, o un tamaño fijo).

Puede encontrar un ejemplo sobre cómo anular onMeasure()mirando los documentos de Android y la LabelViewmuestra en su directorio SDK.

Dalmas
fuente
16
Sería útil saber qué LayoutParams está importando allí.
user3690202
1
El LayoutParamsdebe ser del diseño donde graphViewse coloca el. Por ejemplo, si en el archivo de diseño XML graphViewse coloca dentro RelativeLayout, entonces debe usarnew RelativeLayout.LayoutParams(width, height)
Vic
208

Puede establecer la altura y el ancho de esta manera:

myGraphView.setLayoutParams(new LayoutParams(width, height));
Eric Nordvik
fuente
76
Debes asegurarte de que la clase LayoutParam que utilices sea de la clase de diseño padre correcta. Por ejemplo, si su GraphView está contenido en un LinearLayout, debe usar la clase LinearLayout.LayoutParams.
yincrash
41
Esto también funciona y garantiza que uses la clase LayoutParams correcta: simplemente hazlo myGraphView.getLayoutParams().height = 100;.
sulai
21
Si lo hace this.getLayoutParams().height = 100, asegúrese de seguirlo this.setLayoutParams(this.getLayoutParams()), de lo contrario no hará nada (útil).
Achal Dave
44
Creo que es extraño que esta respuesta obtenga más puntos. Si bien es más fácil, es mucho menos modular; si desea utilizar su vista en un lugar diferente, también necesitará codificar esos valores de ancho / alto allí. Tenga cuidado al usar esto.
gardarh
1
Gracias @yincrash por señalar eso. Sin embargo
ericn
75

puede establecer el alto y el ancho de una vista en un diseño relativo como este

ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = 130;
view.setLayoutParams(params);
Rakshi
fuente
2
no necesita configurar nuevamente el layoutparam. Se refleja automáticamente. Esta es la ventaja del enfoque orientado a objetos.
Dipendra
8
@Dipendra la llamada setLayoutParams()es obligatoria porque invoca otros métodos como resolveLayoutParams()yrequestLayout()
William
dar excepción como en onCreate getLayoutParams () es un valor nulo. Entonces, params.height causa excepción
Sibasish
Debe consultar la vista para la que debe establecer la altura. Compruebe si está apuntando a la misma vista
Rakshi
1
Obtener el layoutParamsinicio de una vista será un NPE, explique en qué punto ejecuta esto.
John Sardinha
6

En Kotlin puede establecer el ancho y el alto de cualquier vista directamente usando sus propiedades virtuales:

someView.layoutParams.width = 100
someView.layoutParams.height = 200
Gundrabur
fuente
4
spin12.setLayoutParams(new LinearLayout.LayoutParams(200, 120));

spin12es tu ruleta y 200 , 120 es widthy heightpara tu spinner.

Ujjwal
fuente
3

Esta es una versión basada en Kotlin, suponiendo que la vista principal es una instancia de LinearLayout.

someView.layoutParams = LinearLayout.LayoutParams(100, 200)

Esto permite establecer el ancho y la altura ( 100y 200) en una sola línea.

Morgan Wilde
fuente