Cet attribut peut-il être modifié dynamiquement dans le code Java?
Android:layout_marginRight
J'ai un TextView
, qui doit changer sa position de quelques pixels à gauche dynamiquement.
Comment le faire par programme?
EDIT: Une manière plus générique de faire cela qui ne repose pas sur le type de présentation (à part que c'est un type de présentation qui prend en charge les marges):
public static void setMargins (View v, int l, int t, int r, int b) {
if (v.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
p.setMargins(l, t, r, b);
v.requestLayout();
}
}
Vous devriez vérifier la documentation pour TextView . En gros, vous souhaiterez obtenir l'objet LayoutParams de TextView, modifier les marges, puis le redéfinir sur TextView. En supposant qu'il s'agisse d'un LinearLayout, essayez quelque chose comme ceci:
TextView tv = (TextView)findViewById(R.id.my_text_view);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)tv.getLayoutParams();
params.setMargins(0, 0, 10, 0); //substitute parameters for left, top, right, bottom
tv.setLayoutParams(params);
Je ne peux pas le tester pour le moment, mon casting peut donc être légèrement décalé, mais ce sont les LayoutParams qui doivent être modifiés pour changer la marge.
N'oubliez pas que si votre TextView est à l'intérieur, par exemple, un RelativeLayout , vous devez utiliser RelativeLayout.LayoutParams au lieu de LinearLayout.LayoutParams
Utilisez LayoutParams (comme déjà expliqué). Attention toutefois aux LayoutParams à choisir. Selon https://stackoverflow.com/a/11971553/3184778 "vous devez utiliser celui qui concerne le PARENT de la vue sur laquelle vous travaillez, pas la vue réelle"
Si, par exemple, TextView est à l'intérieur d'un TableRow, vous devez utiliser TableRow.LayoutParams au lieu de RelativeLayout ou LinearLayout.
tilisez cette fonction pour définir tous les types de marges
public void setViewMargins(Context con, ViewGroup.LayoutParams params,
int left, int top , int right, int bottom, View view) {
final float scale = con.getResources().getDisplayMetrics().density;
// convert the DP into pixel
int pixel_left = (int) (left * scale + 0.5f);
int pixel_top = (int) (top * scale + 0.5f);
int pixel_right = (int) (right * scale + 0.5f);
int pixel_bottom = (int) (bottom * scale + 0.5f);
ViewGroup.MarginLayoutParams s = (ViewGroup.MarginLayoutParams) params;
s.setMargins(pixel_left, pixel_top, pixel_right, pixel_bottom);
view.setLayoutParams(params);
}
Dans Kotlin, vous pouvez déclarer une fonction d'extension telle que:
fun View.setMargins(
leftMarginDp: Int? = null,
topMarginDp: Int? = null,
rightMarginDp: Int? = null,
bottomMarginDp: Int? = null
) {
if (layoutParams is ViewGroup.MarginLayoutParams) {
val params = layoutParams as ViewGroup.MarginLayoutParams
leftMarginDp?.run { params.leftMargin = this.dpToPx(context) }
topMarginDp?.run { params.topMargin = this.dpToPx(context) }
rightMarginDp?.run { params.rightMargin = this.dpToPx(context) }
bottomMarginDp?.run { params.bottomMargin = this.dpToPx(context) }
requestLayout()
}
}
fun Int.dpToPx(context: Context): Int {
val metrics = context.resources.displayMetrics
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), metrics).toInt()
}
Ensuite, vous pouvez l'appeler comme suit:
myView1.setMargins(8, 16, 34, 42)
Ou:
myView2.setMargins(topMarginDp = 8)