En cela , ceci et ce fil, j'ai essayé de trouver une réponse sur la façon de définir les marges sur une seule vue. Cependant, je me demandais s'il n'y avait pas de moyen plus simple. Je vais expliquer pourquoi je préfère ne pas utiliser cette approche:
J'ai un bouton personnalisé qui étend le bouton. Si l'arrière-plan est défini sur autre chose que l'arrière-plan par défaut (en appelant l'un setBackgroundResource(int id)
ou l' autre setBackgroundDrawable(Drawable d)
), je veux que les marges soient 0. Si j'appelle ceci:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
Je veux que les marges soient réinitialisées à -3dp (j'ai déjà lu ici comment convertir des pixels en dp, donc une fois que je sais comment définir des marges en px, je peux gérer la conversion moi-même). Mais comme cela est appelé dans la CustomButton
classe, le parent peut varier de LinearLayout à TableLayout, et je préfère ne pas le faire chercher son parent et vérifier l'instance de ce parent. Ce sera également assez peu performant, j'imagine.
De plus, lors de l'appel (en utilisant LayoutParams) parentLayout.addView(myCustomButton, newParams)
, je ne sais pas si cela l'ajoute à la bonne position (je n'ai pas essayé cependant), disons le bouton central d'une rangée de cinq.
Question: Existe-t-il un moyen plus simple de définir la marge d'un seul bouton par programme en plus d'utiliser LayoutParams?
EDIT: Je connais la méthode LayoutParams, mais j'aimerais une solution qui évite de gérer chaque type de conteneur différent:
ViewGroup.LayoutParams p = this.getLayoutParams();
if (p instanceof LinearLayout.LayoutParams) {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof RelativeLayout.LayoutParams) {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof TableRow.LayoutParams) {
TableRow.LayoutParams lp = (TableRow.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
}
Parce que this.getLayoutParams();
renvoie une ViewGroup.LayoutParams
, qui n'ont pas les attributs topMargin
, bottomMargin
, leftMargin
, rightMargin
. L'instance mc que vous voyez est juste une MarginContainer
qui contient des marges décalées (-3dp) et (oml, omr, omt, omb) et les marges d'origine (ml, mr, mt, mb).
LayoutParams - NE FONCTIONNE PAS! ! !
Besoin d'un type d'utilisation de: MarginLayoutParams
Exemple de code pour MarginLayoutParams:
http://www.codota.com/android/classes/android.view.ViewGroup.MarginLayoutParams
la source
Button
vue:ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) button.getLayoutParams()
retournenull
La meilleure façon qui soit:
Comment appeler la méthode:
J'espère que cela vous aidera.
la source
alors
Ou
la source
Voici la réponse tout-en-un avec les mises à jour récentes:
Étape 1, pour mettre à jour la marge
L'idée de base est d'extraire la marge, puis de la mettre à jour. La mise à jour sera appliquée automatiquement et vous n'avez pas besoin de la réinitialiser. Pour obtenir les paramètres de disposition, appelez simplement cette méthode:
Cela
LayoutParams
vient de la disposition de votre vue. Si la vue provient d'une disposition linéaire, vous devez l'importerLinearLayout.LayoutParams
. Si vous utilisez une disposition relative, une importationLinearLayout.LayoutParams
, etc.Maintenant, si vous définissez la marge à l' aide
Layout_marginLeft
,Right
etc., vous devez la marge de mise à jour de cette façonSi vous définissez la marge à l'aide du nouveau
layout_marginStart
, vous devez mettre à jour la marge de cette façonÉtape 2, pour mettre à jour la marge en dp
Les deux façons de mettre à jour la marge ci-dessus sont la mise à jour en pixels. Vous devez faire une traduction de dp en pixels.
Maintenant, mettez la valeur calculée aux fonctions de mise à jour de la marge ci-dessus et vous devriez être prêt
la source
layout_margin est une contrainte qu'un enfant de vue indique à son parent. Cependant, c'est le rôle du parent de choisir d'autoriser ou non la marge. Fondamentalement, en définissant android: layout_margin = "10dp", l'enfant plaide le groupe de vues parent pour allouer un espace qui est 10dp plus grand que sa taille réelle. (padding = "10dp", d'autre part, signifie que la vue enfant réduira son propre contenu de 10dp .)
Par conséquent, tous les ViewGroups ne respectent pas la marge . L'exemple le plus notoire serait listview, où les marges des éléments sont ignorées. Avant d'appeler
setMargin()
un LayoutParam, vous devez toujours vous assurer que la vue actuelle se trouve dans un ViewGroup qui prend en charge la marge (par exemple LinearLayouot ou RelativeLayout), et convertir le résultat degetLayoutParams()
dans le LayoutParams spécifique de votre choix. (ViewGroup.LayoutParams
n'a même pas desetMargins()
méthode!)La fonction ci-dessous devrait faire l'affaire. Assurez-vous toutefois de remplacer RelativeLayout par le type de la vue parent.
la source
Cette méthode vous permettra de définir la marge dans DP
MISE À JOUR
Vous pouvez modifier le paramètre qui convient à votre besoin.
la source
Dans Kotlin, cela ressemblera à ceci:
la source
Lorsque vous êtes dans une vue personnalisée, vous pouvez utiliser
getDimensionPixelSize(R.dimen.dimen_value)
, dans mon cas, j'ai ajouté la marge dans LayoutParams créée sur lainit
méthode.À Kotlin
en Java:
la source
Vous pouvez utiliser cette méthode et mettre des dimen statiques comme 20 convertis selon votre appareil
la source
Utilisez cette méthode pour définir la marge en dp
appelez la méthode:
la source
Pour une configuration rapide sur une seule ligne, utilisez
mais faites attention à toute mauvaise utilisation de LayoutParams, car cela n'aura pas d'
if
instance de chechla source
Création d'une fonction d'extension Kotlin pour ceux d'entre vous qui pourraient la trouver pratique.
Assurez-vous de passer en pixels et non en dp. Bon codage :)
la source
Dans mon exemple, j'ajoute une ImageView à un LinearLayout par programme. J'ai défini des marges supérieure et inférieure sur ImagerView. Ensuite, en ajoutant ImageView au LinearLayout.
la source
Comme aujourd'hui, le mieux est probablement d'utiliser Paris , une bibliothèque fournie par AirBnB.
Les styles peuvent ensuite être appliqués comme ceci:
il prend également en charge la vue personnalisée (si vous étendez une vue) à l'aide d'annotations:
la source
Vous devez appeler
ainsi:
your_view.setPadding(0,16,0,0)
Ce que vous essayez d'utiliser, c'est seulement le getter.
Le studio Android montre ce que
padding...()
signifie réellement en java:exemple de remplissage L'image montre qu'elle n'appelle que
getPadding...()
Si vous souhaitez ajouter une marge à votre TextView, vous devrez LayoutParams:
la source
J'ai dû lancer le mien
FrameLayout
pour une mise en page linéaire car il en hérite et y définir des marges afin que l'activité n'apparaisse que sur une partie de l'écran avec un arrière-plan différent de celui des paramètres de mise en page d'origine dans lesetContentView
.Aucun des autres n'a travaillé pour utiliser la même activité et changer les marges en ouvrant l'activité à partir d'un menu différent! setLayoutParams n'a jamais fonctionné pour moi - le périphérique plantait à chaque fois. Même s'il s'agit de nombres codés en dur - ce n'est qu'un exemple du code à des fins de démonstration uniquement.
la source
Vous pouvez utiliser
ViewGroup.MarginLayoutParams
pour définir la largeur, la hauteur et les margesOù la méthode
setMargins();
prend des valeurs pour gauche, haut, droite, bas respectivement. Dans le sens horaire !, à partir de la gauche.la source