2010-03-20 3 views
221

Я пытаюсь использовать Java (не XML), чтобы создать LinearLayout с кнопками, которые заполняют экран и имеют поля. Вот код, который работает без полей:Установить поля в 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

http://developer.android.com/reference/android/view/ViewGroup.MarginLayoutParams.html#setMargins(int, Int, Int, Int) Вместо layoutParams.setMargins (30, 20, 30, 0); вы помещаете layoutParams.setMargins (30dp, 20dp, 30dp, 0dp); – DarthestVader

+3

setMargins принимает int как аргументы .. вы можете предоставить только «dp», используя атрибуты xml – jyavenard

ответ

432

Вот немного кода, чтобы выполнить его:

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

Его можно указать поля для виджетов в коде. –

+6

спасибо за образец кода в точке - путь более полезен, чем просто описания –

+24

Похоже, что параметры поля задаются в пикселях. Любой способ установить их в dps? –

62

Так что работает отлично, но как на земле вы дать кнопки поля так есть пространство между ними?

Вы вызываете setMargins() на объект LinearLayout.LayoutParams.

Я попытался с помощью LinearLayout.MarginLayoutParams, но , что не имеет никакого элемента веса, так что нет хорошо.

LinearLayout.LayoutParams является подклассом LinearLayout.MarginLayoutParams, как указано в documentation.

Это невозможно?

No.

это будет не первым Android задачей макета можно сделать только в XML

Вы можете предоставить доказательство этого утверждения.

Лично я не знаю ничего, что может быть достигнуто только через XML, а не через Java-методы в SDK. Фактически, по определению, все должно выполняться с помощью Java (хотя и не обязательно с помощью SDK-достижимых методов), поскольку XML не является исполняемым кодом. Но, если вы знаете что-то, укажите это, потому что это ошибка в SDK, которая должна быть исправлена ​​когда-нибудь.

+2

Ха, хорошо, я понимаю сейчас. Был немного потерян в макетной системе, что довольно сложно. Я не думаю, что во всяком случае для установки layout_widgth/height во время выполнения. – Timmmm

+2

И нет способа установить стиль: http://stackoverflow.com/questions/2016249/how-to-programmatically-setting-style-attribute-in-a-view – Timmmm

+1

У меня не было проблемы с настройкой ширины и высоту во время выполнения через «LayoutPararms». Я понятия стилей ... да, ну, есть причина, по которой я их не использую. :-) – CommonsWare

28

Для добавления полей непосредственно к элементам (некоторые элементы позволяют прямое редактирование поля), вы можете сделать:

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» в случае, если вы попытаетесь запустить ее против чего-то, что не поддерживает поля.

+2

Его точно я ищу. – djdance

+2

Более точный и применимый, чем самый проголосовавший/принятый ответ ... – Rick

7

Попробуйте

LayoutParams params = new LayoutParams(
      LayoutParams.WRAP_CONTENT,  
      LayoutParams.WRAP_CONTENT 
    ); 
    params.setMargins(left, top, right, bottom); 
    yourbutton.setLayoutParams(params); 
+1

это не работает для меня .. – Nik

19

В связи с изменением экрана устройства пикселя плотность его хорошо, чтобы всегда использовать 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); 

Надеюсь, это поможет.

8

Я настроил полей непосредственно с помощью кода ниже

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, иначе будет ошибка.

3
/* 
* invalid margin 
*/ 
private void invalidMarginBottom() { 
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams(); 
    lp.setMargins(0, 0, 0, 0); 
    frameLayoutContent.setLayoutParams(lp); 
} 

вы должны быть изделия типа viewGroup.In отображения вида кода выше, например, я хочу изменить маржу frameLayout, и вид группы в frameLayout является RelativeLayout, так что вам нужно Covert к (RelativeLayout.LayoutParams)

5
MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams(); 
layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin); 
+2

«Хотя этот код может ответить на вопрос, лучше включить объяснение кода здесь. – xenteros

0

Вот одна линия Решение:

((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue)); 
2

Попробуйте это:

MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams(); 
params.width = 250; 
params.leftMargin = 50; 
params.topMargin = 50; 
Смежные вопросы