2010-07-11 3 views
191

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

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

ответ

337

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

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

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

+14

Я не упоминал об этом раньше, так что я извиняюсь. Но я попробовал это, прежде чем задавать свой вопрос. Это заставляет TextView исчезнуть из макета. Но, с положительной стороны, я обнаружил, что установка свойства stretch_columns для TableLayout равным 0 вызывает эффект, который я ищу (TextView слева, CheckBoxes справа). Спасибо за помощь. – eugene

+8

Если вы импортируете XML-макет и не динамически создаете свой макет, вы можете его захватить следующим образом: TextView tv = (TextView) findViewById (R.id.your_textview_inside_the_lingleayout); tv.setLayoutParams (новый LinearLayout.LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0.1f)); ' –

+4

Чтобы установить вес макета программно, вместо' TableLayout.LayoutParams' следует использовать 'TableRow.LayoutParams'. См. Ответ @ Дордже. – Halil

-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; 
     } 
+1

Просто, чтобы вы знали в будущем, решение состоит в том, чтобы установить TableRow, Button1 и Button2, чтобы у всех были «layout_width = fill_parent», и после этого установите «layout_weight = 1» для кнопок button1 и button2. Все элементы с fill_parent и layout_weight = 1 будут иметь равный размер при инфляции. – edthethird

86

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

+0

Этот ответ мне очень помог ... TableLayout не сработал для меня –

+0

Человек, ты спас меня так много времени. Где это указано? Я ничего не нашел в документации о том, что вы не можете обменять 'LayoutParams' –

+0

' TableRow.LayoutParams' тоже сделал для меня работу –

5

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

Установите 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); 
11

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

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

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); 
+0

где вы получаете эту информацию, что 1f означает вес переменная? Можете ли вы предоставить ссылку, пожалуйста? – hayonj

+0

@hayonj просто проверьте источники конструктора 'LinearLayout.LayoutParams'.Третий параметр - вес. Или [документация] (http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html) – mente

1

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

TextView textView = (TextView)findViewById(R.id.text_view); 
ViewGroup.LayoutParams params = textView.getLayoutParams(); 
params.height = ViewGroup.LayoutParams.WRAP_CONTENT; 
textView.setLayoutParams(params); 
+0

примечание, не работает для 2.3 – djdance

6

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

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

lp1.weight=1; 
34

В предыдущих ответах вес передается в конструктор нового объекта 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); 
+0

loparams может быть NULL, поэтому убедитесь, что вы проверяете это до вызова setLayoutParams() – AAgg

+0

@AAgg, не в практической ситуации. Вид не был бы завышен, если бы он не имел ширины и высоты. Но я согласен - это хорошая практика, чтобы проверить, когда есть сомнения в отношении нуля. – sberezin

10
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 обозначается как вес = 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); 
11
TextView txtview = new TextView(v.getContext()); 
LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f); 
txtview.setLayoutParams(params); 

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

5

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

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

param.weight=1.0f;