Как установить атрибут веса макета динамически из кода?
Как я могу установить значение атрибута layout_weight
для кнопки в android динамически из кода java ?
9 ответов:
вы можете передать его как часть
LinearLayout.LayoutParams
конструктора:LinearLayout.LayoutParams param = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1.0f ); YOUR_VIEW.setLayoutParams(param);
последний параметр-вес.
использовать
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: Ах, ответ Эриха проще!
Если вы уже определили свое представление в файле макета (xml), только хотите изменить вес программно, этот способ лучше
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mButton.getLayoutParams(); params.weight = 1.0f; mButton.setLayoutParams(params);
new A LayoutParams перезаписывает другие параметры, определенные в вашем xml-файле, такие как поля, или вам нужно указать все из них в LayoutParams.
если конструктор с шириной, высотой и весом не работает, попробуйте использовать конструктор с шириной и высотой. А затем вручную установить вес.
и если вы хотите, чтобы ширина была установлена в соответствии с весом, установите ширину как 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);
Если я кого-то ищу ответ, используйте этот:
LinearLayout.LayoutParams lay = (LinearLayout.LayoutParams) myLayout.getLayoutParams(); lay.weight = 0.5;
Если вы инициализируете макет из xml-файла, это будет гораздо удобнее, чем предоставление новых параметров макета для линейного макета.
любой
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
будет то же самое.
Если у вас уже определено ваше представление в файле макета (xml) и только хотите изменить вес Pro грамматически, а затем создание новых LayoutParams перезаписывает другие параметры, определенные в вашем xml-файле.
поэтому сначала вы должны использовать "getLayoutParams", а затем setLayoutParams
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mButton.getLayoutParams(); params.weight = 4f; mButton.setLayoutParams(params);
Если
layoutparams
уже определен (в XML или динамически), вот один лайнер:((LinearLayout.LayoutParams) mView.getLayoutParams()).weight = 1;
С помощью Kotlin вы можете сделать что-то вроде:
import android.content.Context import android.support.v4.content.ContextCompat import android.support.v7.widget.CardView import android.widget.* import android.widget.LinearLayout class RespondTo : CardView { constructor(context: Context) : super(context) { init(context) } private fun init(context: Context) { val parent = LinearLayout(context) parent.apply { layoutParams = LinearLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT, 1.0f).apply { orientation = LinearLayout.HORIZONTAL addView(EditText(context).apply { id = generateViewId() layoutParams = LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 0.9f).apply { } }) addView(ImageButton(context).apply({ layoutParams = LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 0.1f) background = null setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_save_black_24px)) id = generateViewId() layoutParams = RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT).apply { addRule(RelativeLayout.ALIGN_PARENT_RIGHT) // addRule(RelativeLayout.LEFT_OF, myImageButton.id) } })) } } this.addView(parent) } }