Установить вес макета TextView программно

214

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

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

Евгений
источник

Ответы:

355

Вы должны использовать TableLayout.LayoutParamsчто-то вроде этого:

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

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

Macarse
источник
15
Я не упоминал об этом раньше, так что извините. Но я попробовал это до того, как задать свой вопрос. Это заставляет TextView исчезать из макета. Но, что положительно, я обнаружил, что установка свойства stretch_columns таблицы TableLayout в 0 вызывает эффект, который я ищу (TextView слева, CheckBoxes справа). Спасибо за помощь.
Евгений
8
Если вы импортируете макет 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));
Эрик Лещинский
5
Чтобы установить вес макета программно, TableRow.LayoutParamsследует использовать вместо TableLayout.LayoutParams. Смотрите ответ @ Дордже.
Halil
import android.widget.LinearLayout; import android.widget.TableLayout;
Пракаш
1
Обратите внимание, что большинство людей будут использовать 0 в качестве первого или второго параметра (в зависимости от того, горизонтальный или вертикальный), а не WRAP_CONTENT, поскольку они ищут, чтобы установить вес.
FlorianB
97

Ответ заключается в том, что вы должны использовать 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

Дордже
источник
Этот ответ мне очень помог ... TableLayout не сработал для меня
sham.y
Оу, ты сэкономил мне столько времени. Где это указано? Я не нашел ничего в документации о том, что вы не можете поменятьсяLayoutParams
Адриан Кадет
TableRow.LayoutParamsсделал работу для меня тоже
Менелай Коцолларис
6
Ключевой частью этого ответа является 0
Леон
Это сократит мое рабочее время. Я ищу это в течение долгого времени. Очень хорошее решение
SIVAKUMAR.J
38

В предыдущих ответах вес передается в конструктор нового объекта 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);
sberezin
источник
loparams может быть NULL, поэтому убедитесь, что вы проверили это перед вызовом setLayoutParams ()
AAgg,
@AAgg, не в практической ситуации. Вид бы не раздулся, если бы не были установлены ширина и высота. Но я согласен - это хорошая практика, чтобы проверить, когда есть сомнения по поводу нуля.
сберезин
16
TextView txtview = new TextView(v.getContext());
LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
txtview.setLayoutParams(params);

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


источник
12

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

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

 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);
Manikandan
источник
откуда вы получаете эту информацию, что 1f означает переменную веса? Можете ли вы предоставить ссылку, пожалуйста?
Хайондж
@hayonj просто проверь источники LinearLayout.LayoutParamsконструктора. 3-й параметр - вес. Или документация
мент
11
TextView text = new TextView(v.getContext());
text.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
                                                LayoutParams.WRAP_CONTENT, 1f));

(ИЛИ)

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

1f упоминается как вес = 1; в соответствии с вашими потребностями вы можете задать 2f или 3f, представления будут перемещаться в соответствии с пространством. Для создания заданного расстояния между видами в линейном макете используйте весовую сумму для «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);
ананд криш
источник
8

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

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

param.weight=1.0f;
Ашок Редди М
источник
7

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

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

 lp1.weight=1;
Киран Бохра
источник
6

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

Сначала установите 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); 
Najem1234
источник
1

Есть еще один способ сделать это. В случае, если вам нужно установить только один параметр, например, «высота»:

TextView textView = (TextView)findViewById(R.id.text_view);
ViewGroup.LayoutParams params = textView.getLayoutParams();
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
textView.setLayoutParams(params);
Дмитрий
источник
1

После борьбы в течение 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));
Гульшан Ядав
источник
-1

У меня было довольно много трудностей с решением, очень похожим на это: попытка иметь две кнопки в 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;
        }
joseph_morris
источник
1
Чтобы вы знали на будущее, решение состоит в том, чтобы установить для TableRow, Button1 и Button2 все значения layout_width=fill_parent, а после этого установить layout_weight=1для button1 и button2. Все элементы с fill_parent и layout_weight = 1 будут иметь одинаковый размер при инфляции.
3