Задание полей в LinearLayout программно
Я пытаюсь использовать Java (а не XML) для создания LinearLayout с кнопками, которые заполняют экран и имеют поля. Вот код, который работает без полей:
LinearLayout buttonsView = new LinearLayout(this);
buttonsView.setOrientation(LinearLayout.VERTICAL);
for (int r = 0; r < 6; ++r) {
Button btn = new Button(this);
btn.setText("A");
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); // Verbose!
lp.weight = 1.0f; // This is critical. Doesn't work without it.
buttonsView.addView(btn, lp);
}
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(buttonsView, lp);
Итак, это прекрасно работает, но как вы даете полям кнопок, чтобы между ними было пространство? Я попытался использовать LinearLayout.MarginLayoutParams
, но у него нет члена weight
, поэтому он не годится. И это не сработает, если вы передадите его lp
в свой конструктор.
Это невозможно? Поскольку он уверен, что это выглядит, и это не будет первая задача компоновки Android, которую вы можете делать только в XML.
Ответы
Ответ 1
Вот небольшой код для его выполнения:
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(30, 20, 30, 0);
Button okButton=new Button(this);
okButton.setText("some text");
ll.addView(okButton, layoutParams);
Ответ 2
Итак, это прекрасно работает, но как на земле вы даете поля кнопок, чтобы между ними есть пространство?
Вы вызываете setMargins()
на объект LinearLayout.LayoutParams
.
Я попытался использовать LinearLayout.MarginLayoutParams, но у которого нет весового члена, так что нет хорошо.
LinearLayout.LayoutParams
является подклассом LinearLayout.MarginLayoutParams
, как указано в документации.
Это невозможно?
Нет.
это не будет первый Android задание макета, которое вы можете выполнять только в XML
Вы можете предоставить доказательство этого требования.
Лично я не знаю ничего, что может быть достигнуто только через XML, а не через Java-методы в SDK. Фактически, по определению, все должно выполняться с помощью Java (хотя и не обязательно с помощью SDK-достижимых методов), поскольку XML не является исполняемым кодом. Но, если вы знаете что-то, укажите это, потому что это ошибка в SDK, которая должна быть исправлена когда-нибудь.
Ответ 3
Чтобы добавить поля непосредственно к элементам (некоторые элементы позволяют прямое редактирование полей), вы можете сделать:
LayoutParams lp = ((ViewGroup) something).getLayoutParams();
if( lp instanceof MarginLayoutParams )
{
((MarginLayoutParams) lp).topMargin = ...;
((MarginLayoutParams) lp).leftMargin = ...;
//... etc
}
else
Log.e("MyApp", "Attempted to set the margins on a class that doesn't support margins: "+something.getClass().getName() );
... это работает без необходимости знать/редактировать окружающий макет. Обратите внимание на проверку "instanceof" в случае, если вы попытаетесь запустить ее против того, что не поддерживает поля.
Ответ 4
Из-за различий в плотности пикселей экрана устройства полезно всегда использовать блок DIP
для программного задания. Как ниже_
//get resources
Resources r = getResources();
float pxLeftMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxTopMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxRightMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxBottomMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, r.getDisplayMetrics());
//get layout params...
LayoutParams params=new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
params.setMargins(Math.round(pxLeftMargin), Math.round(pxTopMargin), Math.round(pxRightMargin), Math.round(pxBottomMargin));
//set margin...
yourLayoutTOsetMargin.setLayoutParams(params);
Надеюсь, это поможет.
Ответ 5
Я установил поля непосредственно, используя ниже код
LinearLayout layout = (LinearLayout)findViewById(R.id.yourrelative_layout);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
params.setMargins(3, 300, 3, 3);
layout.setLayoutParams(params);
Только здесь следует заметить, что LayoutParams
должен быть импортирован для следующего пакета android.widget.RelativeLayout.LayoutParams
, иначе произойдёт ошибка.
Ответ 6
Попробуйте это
LayoutParams params = new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT
);
params.setMargins(left, top, right, bottom);
yourbutton.setLayoutParams(params);
Ответ 7
MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams();
layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);
Ответ 8
/*
* invalid margin
*/
private void invalidMarginBottom() {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams();
lp.setMargins(0, 0, 0, 0);
frameLayoutContent.setLayoutParams(lp);
}
вы должны быть в виде типа view viewGroup. В приведенном выше коде, например, я хочу изменить маркер frameLayout, а группа представления frameLayout - RelativeLayout, поэтому вам нужно до скрытого до (RelativeLayout.LayoutParams)
Ответ 9
Попробуйте следующее:
MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
params.width = 250;
params.leftMargin = 50;
params.topMargin = 50;
Ответ 10
Здесь одна строка Решение:
((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue));