82 votes

Comment modifier la marge d'un TextView

J'ai ajouté un TextView de façon programmatique dans le LinearLayout et lors de certains événements externes, je veux réduire la marge inférieure de ce TextView à -10, pour cela j'ai essayé ce qui suit.

LinearLayout.LayoutParams lastTxtParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lastTxtParams.setMargins(0, 0, 0, -10);
mOldTextView.setLayoutParams(lastTxtParams);
mOldTextView.invalidate();

Quelle est la bonne façon de modifier la marge d'un widget qui a été ajouté à la vue ?
D'une manière ou d'une autre, cela ne fonctionne pas.

188voto

Debarati Points 1723
TextView forgot_pswrd = (TextView) findViewById(R.id.ForgotPasswordText);
forgot_pswrd.setOnTouchListener(this);     
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
llp.setMargins(50, 0, 0, 0); // llp.setMargins(left, top, right, bottom);
forgot_pswrd.setLayoutParams(llp);

J'ai fait ça et ça a parfaitement fonctionné. Peut-être que comme vous donnez la valeur en -ve, c'est pourquoi votre code ne fonctionne pas. Vous venez de mettre ce code où vous créez la référence de la vue.

0 votes

Cet appel nécessite le niveau 19 de l'API.

4 votes

@SanjayKumar - Non, il n'y a pas de contrainte de niveau 19 de l'API.

1 votes

En quoi cela répond-il à la question de l'OP ? Il semble que le code soit le même, à l'exception d'une ligne supplémentaire redondante qui définit l'écouteur tactile, qui n'appelle pas invalidate(), et qui n'indique pas explicitement les arguments dans le constructeur de LinearLayout.LayoutParams [LayoutParams.WRAP_CONTENT vs LinearLayout.LayoutParams.WRAP_CONTENT] ? De plus (même si cela n'a pas d'importance), l'OP demande de définir les marges d'un TextView créé de manière programmatique, bien que la réponse obtienne le TextView à partir du fichier xml du layout, via findViewById(). Je suis curieux de savoir ce que je manque ici...

61voto

Danny Armstrong Points 575

Votre layout en xml comporte probablement déjà un attribut layout_margin(Left|Right|etc), ce qui signifie que vous devez accéder à l'objet généré par ce xml et le modifier.

J'ai trouvé cette solution très simple :

ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) mTextView
        .getLayoutParams();

mlp.setMargins(adjustmentPxs, 0, 0, 0);

break;

Obtenez l'instance LayoutParams de votre aperçu de texte, passez-la à MarginLayoutParams et utilisez la méthode setMargins pour définir les marges.

0 votes

Cela me donne ClassCastException:-> ViewGroup.LayoutParams ne peut pas être transformé en ViewGroup.MarginLayoutParams.

10voto

Shaman Virk Points 51

C'est un problème délicat, j'ai défini une marge pour le texte dans une ligne d'un tableau. Voir l'image ci-dessous :

TableLayout tl = new TableLayout(this);
tl.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

TableRow tr = new TableRow(this);        
tr.setBackgroundResource(R.color.rowColor);

LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.setMargins(4, 4, 4, 4);

TextView tv = new TextView(this);
tv.setBackgroundResource(R.color.textviewColor);
tv.setText("hello");
tr.addView(tv, params);

TextView tv2 = new TextView(this);
tv2.setBackgroundResource(R.color.textviewColor);
tv2.setText("hi");
tr.addView(tv2, params);

tl.addView(tr);
setContentView(tl);

la classe à importer pour les LayoutParams à utiliser dans une ligne de tableau est :

import android.widget.**TableRow**.LayoutParams;

Il est important de noter que j'ai ajouté la classe pour la ligne de table. De même, de nombreuses autres classes sont disponibles pour utiliser LayoutParams comme :

import android.widget.**RelativeLayout**.LayoutParams;

import Android.widget. LinearLayout LayoutParams ;

à utiliser en conséquence.

5voto

Oliver Points 803

SetMargins() définit les marges intérieures du TextView, et non les marges de mise en page. Est-ce bien ce que vous voulez faire ? Ces deux marges différentes peuvent être assez compliquées.

Si vous souhaitez définir les marges de mise en page, modifiez les LayoutParams du TextView (textview.getLayoutParams(), puis modifiez les paramètres de l'objet LayoutParams renvoyé).

Vous n'avez pas besoin de modifier quoi que ce soit sur votre LinearLayout.

Regards, Oliver

3voto

andig Points 3133

TextView ne prend pas en charge setMargins. Docs Android dites :

Même si une vue peut définir un padding, elle ne fournit aucun support pour les marges. Cependant, les groupes de vues fournissent un tel support. Reportez-vous à ViewGroup et ViewGroup.MarginLayoutParams pour plus d'informations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X