Android a défini la hauteur et la largeur de la vue personnalisée par programmation

128

J'ai créé une vue personnalisée nommée Graphview. Voici la structure de la classe GraphView.

public class GraphView extends View {

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

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

J'ai ajouté la vue dans une table en utilisant addview(). Cela fonctionne bien. Maintenant, je veux définir la hauteur et la largeur du fichier GraphView. Comment faire ça?

dev_android
la source

Réponses:

140

Le moyen le plus simple est de définir la taille par programme comme ça:

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

C'est bien si vous connaissez la taille exacte de la vue. Cependant, si vous souhaitez une approche plus flexible, vous pouvez remplacer la onMeasure()méthode pour mesurer la vue plus précisément en fonction de l'espace disponible et des contraintes de mise en page ( wrap_content,match_parent ou une taille fixe).

Vous pouvez trouver un exemple sur la façon de remplacer onMeasure()en consultant les documents Android et l' LabelViewexemple dans votre répertoire SDK.

Dalmas
la source
16
Il serait utile de savoir quels LayoutParams vous y importez.
user3690202
1
Le LayoutParamsdoit provenir de la mise en page où le graphViewest placé. Par exemple, si dans le fichier de mise en page XML graphViewest placé à l'intérieur RelativeLayout, vous devez utilisernew RelativeLayout.LayoutParams(width, height)
Vic
208

Vous pouvez définir la hauteur et la largeur comme ceci:

myGraphView.setLayoutParams(new LayoutParams(width, height));
Eric Nordvik
la source
76
Vous devez vous assurer que la classe LayoutParam que vous utilisez provient de la classe Layout parent correcte. Par exemple, si votre GraphView est contenu dans un LinearLayout, vous devez utiliser la classe LinearLayout.LayoutParams.
yincrash
41
Cela fonctionne également et garantit que vous utilisez la classe LayoutParams correcte: faites simplement myGraphView.getLayoutParams().height = 100;.
sulai
21
Si vous le faites this.getLayoutParams().height = 100, assurez-vous de le suivre this.setLayoutParams(this.getLayoutParams()), sinon il ne fera rien (utile).
Achal Dave
4
Je pense qu'il est étrange que cette réponse obtienne plus de points. Bien que ce soit plus facile, c'est beaucoup moins modulaire; si vous souhaitez utiliser votre vue dans un endroit différent, vous devez également coder en dur ces valeurs de largeur / hauteur. Soyez prudent lorsque vous utilisez ceci.
gardarh
1
Merci @yincrash pour l'avoir signalé. Il semble étrange que je doive utiliser la classe de la vue parente (RelativeLayout dans mon cas) au lieu de la classe parente de ma vue personnalisée (SurfaceView dans mon cas)
ericn
75

vous pouvez définir la hauteur et la largeur d'une vue dans une disposition relative comme celle-ci

ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = 130;
view.setLayoutParams(params);
Rakshi
la source
2
vous n'avez pas besoin de définir à nouveau layoutparam. Il se reflète automatiquement. C'est l'avantage de l'approche orientée objet.
Dipendra
8
@Dipendra l'appel à setLayoutParams()est requis car il invoque d'autres méthodes telles que resolveLayoutParams()etrequestLayout()
William
donner une exception comme dans onCreate getLayoutParams () est une valeur nulle.Donc params.height cause une exception
Sibasish
Vous devez vous référer à la vue pour laquelle vous devez définir la hauteur. Vérifiez si vous pointez vers la même vue
Rakshi
1
Obtenir l' layoutParamsinitiation lors d'une vue sera un NPE, veuillez expliquer à quel moment vous exécutez cela?
John Sardinha
6

Sur Kotlin, vous pouvez définir la largeur et la hauteur de n'importe quelle vue directement en utilisant leurs propriétés virtuelles:

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

spin12est votre spinner et 200 , 120 est widthet heightpour votre spinner.

Ujjwal
la source
3

Il s'agit d'une version basée sur Kotlin, en supposant que la vue parente est une instance de LinearLayout.

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

Cela permet de définir la largeur et la hauteur ( 100et 200) sur une seule ligne.

Morgan Wilde
la source