web-dev-qa-db-fra.com

Android Layout Params change UNIQUEMENT largeur et hauteur

Je sais comment définir la largeur et la hauteur d'une vue à l'aide de LayoutParams en procédant comme suit:

Android.view.ViewGroup.LayoutParams params = button.getLayoutParams();
params.width = height/7;
params.height = height/10;
button.setLayoutParams(params);

Maintenant, dès que je veux appliquer la même hauteur et la même largeur à un autre bouton, je dois créer un autre LayoutParams ou écraser celui qui existe, comme ici:

Android.view.ViewGroup.LayoutParams params2 = but2.getLayoutParams();
params2.width = height/7;
params2.height = height/10;
but2.setLayoutParams(params2);

J'ai environ 50 boutons dans mon application et je doute qu'il soit considéré comme un bon code d'obtenir tous les paramètres pour ne modifier que la largeur et la hauteur. Je souhaite conserver les paramètres restants (toLeftOf, [...]).

Existe-t-il un moyen de changer SEULEMENT la largeur et la hauteur des paramètres tout en conservant le reste des paramètres? Cela ressemble alors à quelque chose comme:

Android.view.ViewGroup.LayoutParams params = button.getLayoutParams();
params.width = height/7;
params.height = height/10;
button.setLayoutParams(params);
button2.setLayoutParams(params);
button3.setLayoutParams(params);
butt[...]

Merci beaucoup d'avance.

8
user2875404

Le but de l’utilisation de la méthode getLayoutParams() est de prendre celles qui existent dans un View (qui garde toutes les règles et tout le reste). Ensuite, vous pouvez modifier des paramètres spécifiques de ces LayoutParams et conserver le reste non modifié. Par conséquent, vous need appelez getLayoutParams() et modifiez l’objet renvoyé si votre Views varie dans les paramètres xml. Au cas où ils utiliseraient exactement les mêmes règles en XML, vous pouvez le faire exactement comme vous l'avez écrit dans votre dernier exemple.

Je vous conseillerais simplement de créer une méthode qui engloberait tout le processus de mise à jour LayoutParams. Ainsi:

private void setDimensions(View view, int width, int height){
    Android.view.ViewGroup.LayoutParams params = view.getLayoutParams();
    params.width = width;
    params.height = height;
    view.setLayoutParams(params);
}

Cela simplifierait considérablement votre code, car vous pourrez alors appeler cette méthode pour chacun de vos boutons, avec les valeurs appropriées pour la largeur et la hauteur.

setDimensions(button, height/7, height/10);
setDimensions(button2, height/7, height/10);
setDimensions(button3, height/7, height/10);
26
Bartek Lipinski

Dans Kotlin nous pouvons le faire plus court et plus élégant:

view.layoutParams = view.layoutParams.apply {
    width = LayoutParams.MATCH_PARENT
    height = LayoutParams.WRAP_CONTENT
}
1
comm1x

Comme d'autres réponses l'ont dit: vous devez getLayoutParams(), modifier l'objet LayoutParams renvoyé et setLayoutParams() avec lui (qu'il s'agisse d'une API raisonnable ou non).

Mais comme le dit comm1x , Kotlin peut rendre cela très simple et facile à lire.

Que dis-tu de ça:

button.alterLayoutParams { 
    it.width = height / 7
    it.height = height / 10
}

Cela nécessite une fonction d'extension:

private fun View.alterLayoutParams(callback: ((ViewGroup.LayoutParams) -> Unit)) {
    val p = this.layoutParams
    callback(p)
    this.layoutParams = p
}

Si vous souhaitez appliquer les mêmes paramètres de présentation à plusieurs Views, vous pouvez procéder comme suit:

listOf(button, button2, button3).forEach { b ->
    b.alterLayoutParams {
        it.width = height / 7
        it.height = height / 10
    }
}

PS Kotlin est tout simplement fantastique.

1
aaaidan

Comme je ne peux pas encore commenter sur d’autres: J'ai créé une fonction d’extension petite et élégante pour Kotlin.

fun <T: ViewGroup.LayoutParams>View.layoutParams(run: T.() -> Unit) {
    val params = layoutParams as T
    run(params)
    layoutParams = params
}

Un cas d'utilisation pour une vue dans un constraintLayout par exemple serait:

view.layoutParams<ConstraintLayout.LayoutParams> {
    width = LayoutParams.WRAP_CONTENT
    height = LayoutParams.WRAP_CONTENT
}

Si vous n'avez pas besoin d'une implémentation spécifique de LayoutParams (il est conseillé d'en utiliser une spécifique), vous pouvez utiliser une version plus petite de la fonction d'extension:

fun View.layoutParams(run: ViewGroup.LayoutParams.() -> Unit) {
    val params = layoutParams
    run(params)
    layoutParams = params
}

..qui entraînerait:

view.layoutParams {
    width = LayoutParams.WRAP_CONTENT
    height = LayoutParams.WRAP_CONTENT
}
0
Jolan Rensen