2011-01-09 2 views
166

Как установить значение для атрибута layout_weight для кнопки в android динамически из java-кода?Как установить атрибут layout_weight динамически из кода?

+0

Это будет очень похож на этот вопрос/ответ: http://stackoverflow.com/questions/4638832/how-to -programmatically-set-the-layout-align-parent-right-attribute-of-a-button-i/4639012 # 4639012, и этот: http://stackoverflow.com/questions/4637233/how-to-set- layout-span-through-code/4637266 # 4637266 – Qberticus

+0

Если вы уже определили представление в макете (xml), то создание новых LayoutParams перезаписывает другие параметры, определенные в XML-файле. Поэтому сначала вы должны использовать «getLayoutParams». См. Полный ответ http://stackoverflow.com/questions/4641072/how-to-set-layout-weight-attribute-dynamically-from-code/38011495#38011495 –

ответ

319

Вы можете передать его в качестве части LinearLayout.LayoutParams конструктора:

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
    LayoutParams.MATCH_PARENT, 
    LayoutParams.MATCH_PARENT, 
    1.0f 
); 
YOUR_VIEW.setLayoutParams(param); 

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

+2

Это должно быть 'param = new LayoutParams (LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, (float) 1.0); ' –

+37

Если вы не хотите отбрасывать из double в float, просто поставьте 1.0f – Xample

+6

Или даже проще поместите' 1f', если нет десятичных знаков – sandalone

97

Использование LinearLayout.LayoutParams:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
    LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); 
params.weight = 1.0f; 
Button button = new Button(this); 
button.setLayoutParams(params); 

EDIT: Ах, ответ Эриха проще!

+23

Эфир Erich может быть проще писать, но ваш читать легче. Поскольку он говорит, для какого атрибута используется 1.0f. – Johan

+3

ваш установлен, что вы можете изменить вес «на лету», вызвав «view.getLayoutParams()», а затем измените значение. – RobGThai

+1

'FILL_PARENT' устарел, и вместо этого следует использовать' MATCH_PARENT'. –

5

Любое из LinearLayout.LayoutParams и TableLayout.LayoutParams работало для меня, для кнопок справа TableRow.LayoutParams. То есть:

  TableRow.LayoutParams buttonParams = new TableRow.LayoutParams(
        TableRow.LayoutParams.MATCH_PARENT, 
        TableRow.LayoutParams.WRAP_CONTENT, 1f); 

Об использовании MATCH_PARENT или WRAP_CONTENT быть одинаковыми.

+3

'FILL_PARENT' устарел, и вместо него следует использовать MATCH_PARENT'. –

+0

Я думаю, что LayoutParams.MATCH_PARENT следует изменить на 0. – CoolMind

17

Если конструктор с шириной, высотой и весом не работает, попробуйте использовать конструктор с шириной и высотой. А затем вручную установите вес.

И если вы хотите, чтобы ширина была задана в соответствии с весом, установите ширину как 0 в конструкторе. То же самое относится и к высоте. Ниже код работает для меня.

LinearLayout.LayoutParams childParam1 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT); 
childParam1.weight = 0.3f; 
child1.setLayoutParams(childParam1); 

LinearLayout.LayoutParams childParam2 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT); 
childParam1.weight = 0.7f; 
child2.setLayoutParams(childParam2); 

parent.setWeightSum(1f); 
parent.addView(child1); 
parent.addView(child2); 
+0

Только то, что мне нужно! Каждый говорит о настройке веса здесь, никто не показывал, что происходит, когда взвешенные дети добавляются в родительский вид! Я действительно искал, как добавить weightSum в ParentView! Благодаря! – sud007

60

Если вы уже определить свой вид в файле макет (XML), только нужно изменить вес программно, таким образом, лучше

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) 
mButton.getLayoutParams(); 
params.weight = 1.0f; 
mButton.setLayoutParams(params); 

нового LayoutParams перезаписывает другой Params, определенный в вас XML как поля, или вам нужно указать все их в LayoutParams.

+1

С "params.weight = 1f;" вы уже устанавливаете вес объекта LayoutParams. Нет необходимости называть «mButton.setLayoutParams (params)». – MrMaffen

+1

Нет, вам нужно позвонить setLayoutParams –

+1

Это на самом деле самый элегантный ответ, и он напрямую изменяет определенный объект пользовательского интерфейса. Лучший ответ тоже хорош и старше, чем этот пост. Поэтому он заслуживает лучшего ответа. Я сохранил этот пост, хотя. –

11

Если я кого-то ищет ответ, используйте:

LinearLayout.LayoutParams lay = (LinearLayout.LayoutParams) myLayout.getLayoutParams(); 
lay.weight = 0.5; 

Если инициализация макета из XML-файла, это будет гораздо удобнее, чем предоставление новых параметров макета для Linear Layout.

+0

Это должен быть принятый ответ, поскольку он не изменяет ранее установленные переменные, такие как ширина/высота/маржа/отступы и т. Д. Все сохраняется и повторно используется при изменении веса. – MrMaffen

+0

Если представление для установки 'layout_weight' уже выложено, вам нужно вызвать' View.requestLayout() 'для обновления. – Suzi

1

Если у вас есть , то вы уже определили свой вид в макете (xml) и хотите только похудеть, а затем создание новых LayoutParams перезаписывает другие параметры, определенные в вашем XML-файле.

Итак, сначала вы должны использовать "getLayoutParams", а затем setLayoutParams

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mButton.getLayoutParams(); params.weight = 4f; mButton.setLayoutParams(params);

Смежные вопросы