Программно установить вес макета TextView

Я пытаюсь динамически создавать TableRow объекты и добавлять их в TableLayout. Объекты TableRow имеют 2 элемента: TextView и CheckBox. Для TextView элементов вес макета должен быть установлен равным 1, чтобы CheckBox элементы перемещались в крайнее правое положение.

Я не могу найти документацию о том, как программно установить вес макета для элемента TextView.


person eugene    schedule 11.07.2010    source источник


Ответы (12)


Вы должны использовать TableLayout.LayoutParams примерно так:

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

Последний параметр - это вес.

person Macarse    schedule 11.07.2010
comment
Я не упоминал об этом раньше, так что мне очень жаль. Но я пробовал это до того, как задал свой вопрос. Это заставляет TextView исчезнуть из макета. Но, к лучшему, я обнаружил, что установка для свойства stretch_columns TableLayout значения 0 вызывает эффект, который я ищу (TextView слева, CheckBoxes справа). Спасибо за помощь. - person eugene; 12.07.2010
comment
Если вы импортируете макет XML и не создаете макет динамически, вы можете получить его следующим образом: TextView tv = (TextView) findViewById(R.id.your_textview_inside_the_linearlayout); tv.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0.1f)); - person Eric Leschinski; 14.04.2012
comment
Чтобы программно установить вес макета, вместо TableLayout.LayoutParams следует использовать TableRow.LayoutParams. См. Ответ @Dorje. - person Halil; 28.08.2014
comment
import android.widget.LinearLayout; import android.widget.TableLayout; - person Prakash; 17.11.2015
comment
Обратите внимание, что большинство людей будут использовать 0 в качестве первого или второго параметра (в зависимости от горизонтального или вертикального), а не WRAP_CONTENT, поскольку они ищут вес. - person FlorianB; 14.11.2016
comment
table.setStretchAllColumns (истина); - person Hack06; 13.10.2017

Ответ заключается в том, что вам нужно использовать TableRow.LayoutParams, а не LinearLayout.LayoutParams или любые другие LayoutParams.

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

Различные LayoutParams не являются взаимозаменяемыми, и если вы используете неправильный, ничего не произойдет. Родителем текстового представления является строка таблицы, поэтому:

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

person Dorje    schedule 31.07.2012
comment
Этот ответ мне очень помог ... TableLayout не работал у меня - person sham.y; 18.09.2014
comment
Ой, ты сэкономил мне столько времени. Где это указано? Я не нашел в документации ничего о том, что вы не можете обменять LayoutParams - person Adrien Cadet; 07.01.2015
comment
TableRow.LayoutParams тоже сделал работу за меня - person Menelaos Kotsollaris; 09.02.2015
comment
Ключевой частью этого ответа является 0 - person Leon; 12.11.2015
comment
Это сократит мое рабочее время. Я ищу это уже давно. Отличное решение. - person SIVAKUMAR.J; 14.02.2018

В предыдущих ответах вес передается конструктору нового объекта SomeLayoutType.LayoutParams. Тем не менее, во многих случаях удобнее использовать существующие объекты - это помогает избежать работы с параметрами, которые нам не интересны.

Пример:

// 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);
person sberezin    schedule 03.05.2014
comment
loparams может иметь значение NULL, поэтому убедитесь, что вы проверили это перед вызовом setLayoutParams () - person AAgg; 09.07.2015
comment
@AAgg, не в практической ситуации. Вид не раздулся, если бы не были заданы ширина и высота. Но я согласен - это хорошая практика - проверять, когда есть сомнения по поводу null. - person sberezin; 10.07.2015

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

1f обозначается как weight = 1; вы можете указать 2f или 3f, просмотры переместятся в соответствии с пространством

person Community    schedule 29.02.2016

просто установите параметры макета в этом макете, например

создать переменную параметра

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

1f - весовая переменная

установите свой виджет или макет, например

 TextView text = (TextView) findViewById(R.id.text);
 text.setLayoutParams(params);
person Manikandan    schedule 04.05.2013
comment
откуда вы берете информацию о том, что 1f означает весовую переменную? Не могли бы вы дать ссылку? - person hayonj; 25.09.2013
comment
@hayonj просто проверьте источники LinearLayout.LayoutParams конструктора. 3-й параметр - вес. Или документацию - person mente; 25.10.2013

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

(OR)

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

1f обозначается как weight = 1; в соответствии с вашими потребностями вы можете указать 2f или 3f, просмотры будут перемещаться в соответствии с пространством. Чтобы указать расстояние между видами в линейном макете, используйте weightsum для 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);
person anand krish    schedule 08.12.2014

Это должно сработать для вас

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

param.weight=1.0f;
person Ashok Reddy M    schedule 08.08.2016

Вы также можете указать вес отдельно, вот так:

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

 lp1.weight=1;
person kiran boghra    schedule 08.02.2014

Эта работа для меня, и я надеюсь, что она сработает и для вас

Сначала установите LayoutParams для родительского представления:

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

затем установите для TextView (дочерний):

 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); 
person Najem1234    schedule 20.08.2012

После борьбы в течение 4 часов. Наконец, этот код сработал для меня.

3 столбца в ряд.

  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));
person Gulshan Yadav    schedule 20.04.2019

Есть другой способ сделать это. Если вам нужно установить только один параметр, например высоту:

TextView textView = (TextView)findViewById(R.id.text_view);
ViewGroup.LayoutParams params = textView.getLayoutParams();
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
textView.setLayoutParams(params);
person Dmitry    schedule 28.01.2014

У меня были изрядные трудности с решением, очень похожим на это: попытаться иметь две кнопки в TableRow, каждая из которых занимает половину ширины экрана. По какой-то причине левая кнопка всегда будет составлять около 70% ширины, а правая кнопка - 30%. Вызов table_layout.setStretchAllColumns (true) не повлиял ни на что, ни установка ширины кнопки на половину экрана, ни установка веса их макета.

Решение, к которому я пришел, заключалось во вложении LinearLayout в TableRows, что действительно учитывало значение ширины кнопок.

    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;
        }
person joseph_morris    schedule 02.09.2011
comment
Просто чтобы вы знали на будущее, решение состоит в том, чтобы установить для всех TableRow, Button1 и Button2 layout_width=fill_parent, а после этого установить layout_weight=1 для кнопок button1 и button2. Все элементы с fill_parent и layout_weight = 1 будут иметь одинаковый размер при надувании. - person edthethird; 02.03.2012