Программно добавление полей к объекту кнопки

Нужно задавать левое поле объекту кнопки программно. Это сегмент кода:

RelativeLayout rl = (RelativeLayout) findViewById(R.id.for_button);
MarginLayoutParams ml = new MarginLayoutParams(-2,-2);
ml.setMargins(5, 0, 0, 0);

Button btn = new Button(this);
btn.setText("7");
btn.setTextColor(Color.WHITE);
btn.setBackgroundResource(R.drawable.date_button);

rl.addView(btn,ml)

Я также пробовал

btn.setLayoutParams(ml);
rl.addView(btn);

Какая большая проблема. Или есть альтернативный способ?

Ответ 1

Вы используете RelativeLayout в качестве родителя для кнопки, но вы не укажете никаких правил для нее, где нужно поместить кнопку (например, ALIGN_PARENT_LEFT и ALIGN_PARENT_TOP).

Вы должны установить правила для позиции при использовании RelativeLayout, хотя это противоречит раскладке макета. Это означает, что вы должны использовать RelativeLayout.LayoutParams вместо MarginLayoutParams, потому что первая разрешает эти правила и имеет соответствующие значения по умолчанию.

Изменить эту строку:

MarginLayoutParams ml = new MarginLayoutParams(-2,-2);

to

RelativeLayout.LayoutParams ml = new RelativeLayout.LayoutParams(-2,-2);

Скорее всего, вы также хотите добавить правила, потому что значения по умолчанию по умолчанию вам не подходят (представления по умолчанию позиционируются в верхнем левом углу родительского макета). Вы можете использовать RelativeLayout.LayoutParams.addRule() для этого.

Ответ 2

Хорошо, я собираюсь дать этому выстрел IronBlossom; вот как я это делаю, и надеюсь, что это сработает:

LinearLayout myLinearLayout = (LinearLayout)findViewById(R.id.my_linear_layout);
Button myButton = new Button(this);
// more myButton attribute setting here like text etc //

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
params.setMargins(5,0,0,0);
myLinearLayout.addView(myButton, params);

лучше

-serkan