Bir LinearLayout'ta kenar boşluklarını programlı olarak ayarlama


266

Ekranı dolduran ve kenar boşlukları olan bir LinearLayout oluşturmak için Java ( XML değil ) kullanmaya çalışıyorum . Kenar boşlukları olmadan çalışan kod:

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

Peki, bu iyi çalışıyor, ancak aralarında boşluk olması için düğmelerin kenar boşluklarını nasıl verirsiniz? Kullanmayı denedim LinearLayout.MarginLayoutParams, ancak hiçbir weightüyesi yok, bu yüzden iyi değil. Ve lpyapıcısına da geçerseniz işe yaramaz .

Bu imkansız mı? Kesinlikle göründüğü için ve yalnızca XML'de yapabileceğiniz ilk Android düzeni görevi olmaz.


1
developer.android.com/reference/android/view/… , int, int, int) layoutParams.setMargins yerine (30, 20, 30, 0); layoutParams.setMargins (30dp, 20dp, 30dp, 0dp);
DarthestVader

3
setMargins int argüman olarak alır .. sadece xml özniteliklerini kullanarak "dp" sağlayabilirsiniz
jyavenard

Yanıtlar:


496

İşte bunu gerçekleştirmek için küçük bir kod:

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

6
nokta kod örneği için teşekkürler - sadece açıklamalardan çok daha faydalı
Birisi

25
Kenar boşlukları piksel olarak ayarlanmış gibi görünüyor. Onları dps olarak ayarlamanın herhangi bir yolu var mı?
Artem Russakovskii

30
@ArtemRussakovskii Android'deki çoğu işlev gibi, piksel alırlar. Düşüşleri px'e dönüştüren küresel bir yardımcı program işlevi öneririm. Tüm uygulamalarımda bunu yaptım. Android API berbat.
mxcl

7
@MaxHowell Sonunda bunu yaptım. Bunun gibi temel şeylerin bazen eksik olması inanılmaz.
Artem Russakovskii

5
@ArtemRussakovskii - DIP'yi PX'e dönüştürmek için TypedValue.applyDimension (...) kullanın. Bkz. Stackoverflow.com/questions/2238883/…
Gautam

64

Peki, bu iyi çalışıyor, ancak aralarında boşluk olması için düğmelerin kenar boşluklarını nasıl verirsiniz?

Sen buna setMargins()üzerindeki LinearLayout.LayoutParamsnesne.

LinearLayout.MarginLayoutParams kullanmayı denedim, ancak ağırlık üyesi yok, bu yüzden iyi değil.

LinearLayout.LayoutParamsdokümanındaLinearLayout.MarginLayoutParams belirtildiği gibi bir alt sınıfıdır .

Bu imkansız mı?

Hayır.

yalnızca XML'de yapabileceğiniz ilk Android düzeni görevi olmaz

Bu iddianın kanıtını sunabilirsiniz.

Şahsen, SDK'daki Java yöntemleri ile değil, sadece XML ile gerçekleştirilebilecek hiçbir şeyin farkında değilim. Aslında, tanım gereği, XML çalıştırılabilir kod olmadığından, her şey Java ile (SDK'ya ulaşılabilir yöntemler ile zorunlu olmamakla birlikte) yapılabilir olmalıdır. Ancak, bir şeyin farkındaysanız, buna dikkat edin, çünkü SDK'da bir gün düzeltilmesi gereken bir hata.


2
Ha, tamam şimdi anlıyorum. Oldukça karmaşık olan düzen sisteminde biraz kayboluyordum. Zaten çalışma zamanında layout_widgth / height ayarlamak için olduğunu sanmıyorum.
Timmmm

2
Ve stili ayarlamanın bir yolu yok: stackoverflow.com/questions/2016249/…
Timmmm

1
Çalışma zamanında genişliği ve yüksekliği ayarlamakla ilgili bir sorun yaşamadım LayoutPararms. Stil terimleri ... evet, onları kullanmamamın bir nedeni var. :-)
CommonsWare

6
Programlı olarak bir kullanıcı arayüzü oluşturmanın neden böyle bir PITA olduğunu bilmek istiyorum
Birisi

3
Birkaç gün önce bu marjı desteklemeyen yanlış LayoutParams'ı içe aktardım ... Bu cevapları okurken içe aktarma işlemimi kaldırmaya karar verdim. 10'dan fazla seçenek var D: linearLayout.LayoutParams için gittim. İşler.
Doomsknight

31

Öğelere doğrudan kenar boşlukları eklemek için (bazı öğeler kenar boşluklarının doğrudan düzenlenmesine izin verir) şunları yapabilirsiniz:

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() );

... bu, çevredeki düzeni bilmeye / düzenlemeye gerek kalmadan çalışır. Bunu kenar boşluklarını desteklemeyen bir şeyle çalıştırmayı denemeniz durumunda "instanceof" onayına dikkat edin.


2
Tam olarak arıyorum.
djdance

21

Cihaz ekranı piksel yoğunluklarındaki değişiklik nedeniyle, DIPmarjı programlı olarak ayarlamak için her zaman birimi kullanmak iyidir . Below_ gibi

//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); 

Umarım bu yardımcı olur.


10

Doğrudan aşağıdaki kodu kullanarak kenar boşlukları ayarladım

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

Buradaki tek şey, LayoutParamsaşağıdaki paket için içe aktarılması gerektiğini fark etmektir android.widget.RelativeLayout.LayoutParams, aksi takdirde bir hata olacaktır.


7

Bunu dene

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

2
“Bu kod soruyu cevaplayabilirken, kodun açıklamasını buraya eklemek daha iyidir.
xenteros

4

Bunu dene:

MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
params.width = 250;
params.leftMargin = 50;
params.topMargin = 50;

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

Yukarıdaki kodda, örneğin frameLayout'un kenar boşluğunu değiştirmek istiyorum ve frameLayout'un görünüm grubu bir RelativeLayout,türünde bir eşya olmalıdır , bu yüzden (RelativeLayout.LayoutParams)


0

İşte tek satırlık bir çözüm:

((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.