Définir le poids de la mise en page d'un TextView par programmation

214

J'essaie de créer dynamiquement des TableRowobjets et de les ajouter à un TableLayout. Les TableRowobjets ont 2 éléments, un TextViewet unCheckBox . Les TextViewéléments doivent avoir leur poids de mise en page défini sur 1 pour pousser les CheckBoxéléments à l'extrême droite.

Je ne trouve pas de documentation sur la façon de définir par programmation le poids de la mise en page d'un TextViewélément.

Eugène
la source

Réponses:

355

Vous devez utiliser TableLayout.LayoutParamsavec quelque chose comme ça:

TextView tv = new TextView(v.getContext());
tv.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1f));

Le dernier paramètre est le poids.

Macarse
la source
15
Je ne l'ai pas mentionné auparavant, donc je suis désolé. Mais j'ai essayé avant de poser ma question. Cela fait disparaître TextView de la mise en page. Mais, sur une note positive, j'ai trouvé que la définition de la propriété stretch_columns du TableLayout à 0 provoque l'effet que je recherche (TextView à gauche, CheckBox à droite). Merci pour l'aide.
eugene
8
Si vous importez une mise en page XML et que vous ne créez pas votre mise en page de manière dynamique, vous pouvez la saisir comme ceci:TextView tv = (TextView) findViewById(R.id.your_textview_inside_the_linearlayout); tv.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0.1f));
Eric Leschinski
5
Pour définir le poids de la mise en page par programme, TableRow.LayoutParamsdoit être utilisé à la place de TableLayout.LayoutParams. Voir la réponse de @ Dorje.
Halil
import android.widget.LinearLayout; import android.widget.TableLayout;
Prakash
1
Notez que la plupart des gens utiliseraient 0 comme premier ou deuxième paramètre (selon qu'ils soient horizontaux ou verticaux) et non WRAP_CONTENT car ce qu'ils recherchent est de définir le poids.
FlorianB
97

La réponse est que vous devez utiliser TableRow.LayoutParams, pas LinearLayout.LayoutParams ou tout autre LayoutParams.

TextView tv = new TextView(v.getContext());
LayoutParams params = new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
tv.setLayoutParams(params);

Les différents LayoutParams ne sont pas interchangeables et si vous utilisez le mauvais, alors rien ne semble se produire. Le parent de la vue texte est une ligne de tableau, d'où:

http://developer.android.com/reference/android/widget/TableRow.LayoutParams.html

Dorje
la source
Cette réponse m'a beaucoup aidé ... TableLayout n'a pas fonctionné pour moi
sham.y
Oh mec, tu m'as fait gagner tellement de temps. Où est-il spécifié? Je n'ai rien trouvé dans la documentation sur vous ne pouvez pas échangerLayoutParams
Adrien Cadet
TableRow.LayoutParamsa fait le travail pour moi aussi
Menelaos Kotsollaris
6
La partie clé de cette réponse est le 0
Leon
Cela réduira mon temps de travail.Je recherche cela pendant longtemps.Très bonne solution
SIVAKUMAR.J
38

Dans les réponses précédentes, le poids est transmis au constructeur d'un nouvel objet SomeLayoutType.LayoutParams. Dans de nombreux cas, il est toujours plus pratique d'utiliser des objets existants - cela permet d'éviter de traiter des paramètres qui ne nous intéressent pas.

Un exemple:

// Get our View (TextView or anything) object:
View v = findViewById(R.id.our_view); 

// Get params:
LinearLayout.LayoutParams loparams = (LinearLayout.LayoutParams) v.getLayoutParams();

// Set only target params:
loparams.height = 0;
loparams.weight = 1;
v.setLayoutParams(loparams);
sberezin
la source
loparams pourrait être NULL alors assurez-vous de vérifier cela avant d'appeler setLayoutParams ()
AAgg
@AAgg, pas dans une situation pratique. La vue ne se serait pas gonflée si la largeur et la hauteur n'avaient pas été définies. Mais je suis d'accord - c'est une bonne pratique de vérifier quand il y a des doutes sur null.
sberezin
16
TextView txtview = new TextView(v.getContext());
LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
txtview.setLayoutParams(params);

1f est dénoté comme poids = 1; vous pouvez donner 2f ou 3f, les vues se déplaceront selon l'espace


la source
12

il suffit de définir les paramètres de mise en page dans cette mise en page comme

créer une variable param

 android.widget.LinearLayout.LayoutParams params = new android.widget.LinearLayout.LayoutParams(
            LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f);

1f est variable en poids

définissez votre widget ou mise en page comme

 TextView text = (TextView) findViewById(R.id.text);
 text.setLayoutParams(params);
Manikandan
la source
où obtenez-vous cette information que 1f signifie la variable de poids? Pouvez-vous fournir un lien s'il vous plaît?
hayonj
@hayonj vérifie simplement les sources du LinearLayout.LayoutParamsconstructeur. Le troisième paramètre est le poids. Ou documentation
mente
11
TextView text = new TextView(v.getContext());
text.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
                                                LayoutParams.WRAP_CONTENT, 1f));

(OU)

TextView tv = new TextView(v.getContext());
LayoutParams params = new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
tv.setLayoutParams(params);

1f est appelé poids = 1; selon votre besoin, vous pouvez donner 2f ou 3f, les vues se déplaceront selon l'espace. Pour faire la distance spécifiée entre les vues dans la disposition linéaire, utilisez la somme de poids pour "LinearLayout".

LinearLayout ll_Outer= (LinearLayout ) view.findViewById(R.id.linearview);
LinearLayout llInner = new LinearLayout(this);
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent);
            llInner.Orientation = Orientation.Horizontal;
            llInner.WeightSum = 2;
            ll_Outer.AddView(llInner);
anand krish
la source
8

Cela devrait vous convenir

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT LayoutParams.MATCH_PARENT);

param.weight=1.0f;
Ashok Reddy M
la source
7

Vous pouvez également donner du poids séparément comme ceci,

LayoutParams lp1 = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);

 lp1.weight=1;
kiran boghra
la source
6

Ce travail pour moi, et j'espère qu'il fonctionnera aussi pour vous

Définissez d'abord les LayoutParams pour la vue parent:

myTableLayout.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT,
                TableLayout.LayoutParams.FILL_PARENT));

puis définissez pour TextView (enfant):

 TableLayout.LayoutParams textViewParam = new TableLayout.LayoutParams
     (TableLayout.LayoutParams.WRAP_CONTENT,
     TableLayout.LayoutParams.WRAP_CONTENT,1f);
     //-- set components margins
     textViewParam.setMargins(5, 0, 5,0);
     myTextView.setLayoutParams(textViewParam); 
Najem1234
la source
1

Il existe une autre façon de procéder. Dans le cas où vous ne devez définir qu'un seul paramètre, par exemple «hauteur»:

TextView textView = (TextView)findViewById(R.id.text_view);
ViewGroup.LayoutParams params = textView.getLayoutParams();
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
textView.setLayoutParams(params);
Dmitry
la source
1

Après avoir lutté pendant 4 heures. Enfin, ce code a fonctionné pour moi.

3 colonnes sont là dans une rangée.

  TextView serialno = new TextView(UsersActivity.this);
  TextView userId = new TextView(UsersActivity.this);
  TextView name = new TextView(UsersActivity.this);

  serialno.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
  userId.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
  name.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
Gulshan Yadav
la source
-1

J'ai eu beaucoup de difficulté avec une solution quelque chose de très similaire à ceci: essayer d'avoir deux boutons dans un TableRow, chacun étant la moitié de la largeur de l'écran. Pour une raison quelconque, le bouton gauche serait toujours d'environ 70% de la largeur et le bouton droit 30%. L'appel de table_layout.setStretchAllColumns (true) n'a eu aucun effet, ni la définition de la largeur du bouton à la moitié de l'écran, ni la définition de leur poids de mise en page.

La solution que j'ai trouvée était d'imbriquer un LinearLayout dans les TableRows, qui tenait compte de la valeur de la largeur des boutons.

    TableLayout layout = new TableLayout(this);
    TableRow top_row = new TableRow(this);
    left_button = styleButton();
    right_button = styleButton();
    LinearLayout toprow_layout = new LinearLayout (this);
    toprow_layout.setOrientation(LinearLayout.HORIZONTAL);
    toprow_layout.addView (left_button);
    toprow_layout.addView(right_button);
    toprow.addView(top_layout);
    layout.addView(top_row)

    private Button styleButton() {
            Button btn = new Button (this);
            android.view.Display display = ((android.view.WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();      
            btn.setWidth((int)(display.getWidth()/2));    // set width to half
            btn.setHeight(((int)display.getHeight()/6));  // set height to whatevs
            btn.setText("foo");
            return btn;
        }
joseph_morris
la source
1
Juste pour que vous sachiez pour l'avenir, la solution est de définir le TableRow, Button1 et Button2 pour tous les avoir layout_width=fill_parent, et après cela, définissez le layout_weight=1pour à la fois button1 et button2. Tous les éléments avec fill_parent et un layout_weight = 1 recevront une taille égale lors du gonflage.
troisième