LinearLayout çocukları arasında nasıl boşluk bırakılır?


160

Programlı olarak dikey bir LinearLayout'a özel görünümler ekliyorum ve görünümler arasında biraz boşluk olmasını istiyorum. Ekleme denedim: benim CustomView yapıcıya setPadding (0, 1, 0, 1), ama bu herhangi bir etkisi yok gibi görünüyor. Herhangi bir tavsiye?

* Kenar boşlukları kullanmam gerektiği belirtildi. Dinamik olarak görünümler eklediğim için, koddaki kenar boşluklarını ayarlamam gerekiyor (xml'de değil). Bunu yapmanın yolunun aşağıda olduğuna inanıyorum, ancak işe yaramıyor.

public class MyView extends View
{
    public MyView (Context context)
    {
        super(context);

        MarginLayoutParams params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT,  LayoutParams.WRAP_CONTENT);
        params.setMargins(0, 10, 0, 10);
        setLayoutParams(params);

*Düzenle. Ayrıca Doğrusal düzen (aşağıdaki gibi) görünümleri eklerken bir parametre olarak MarginLayoutParams kullanarak çalıştı. Bu da işe yaramadı:

MarginLayoutParams params = new MarginLayoutParams(linearLayout.getLayoutParams());
linearLayout.setMargins(0, 10, 0, 10);
linearLayout.addView(view, params);

Görünümleri eklemek istediğiniz XML dosyasını eklediyseniz yardımcı olabilir.
Dennis Winter

2
İşte bununla ilgili mükemmel bir blog yazısı: Cyril Mottier tarafından Android'de Izgara Aralığı
Richard Le Mesurier

Yanıtlar:


132

android:layout_margin<Side>Çocukların üzerinde olmalısın . Dolgu iç kısımdadır.


XML'deki görünümü istediğiniz kenar boşluklarıyla tanımlayabilir ve içeriği Java kodunda da uygulayarak önceden tanımlanmış görünümleri prosedürel olarak ekleyebilirsiniz.
Mike Yockey

Bununla ne demek istediğin konusunda net değilim. Özel görünümü xml olarak tanımlamalıyım? Ancak dinamik olarak, daha sonra LinearLayout'uma ekleyeceğim isteğe bağlı sayıda özel görünüm oluşturmam gerekecek.
ab11

2
Sadece MarginLayoutParams değil LayoutParams kullanmayı deneyin.
Thomas

1
LinearLayout.LayoutParams'da hangi özelliği ayarlayabilirim? Bu sınıfta "kenar boşlukları" veya "dolgu" ya da benzeri bir şey yok mu?
ab11

@Tamamlar "Doldurma içtir" ile neyi kastediyorsunuz? Yinelenen kodları en aza indirgemek için kaçınmaya çalıştığım bileşenlerin her birinde marj uyguluyor olmalıyım (çocuk bileşenlerim arasında kullanılacak eşit aralıklara sahip olduğum için)
OmGanesh

188

API> = 11 çözeltisi:

Dolguyu ayırıcıya entegre edebilirsiniz. Hiçbirini kullanmadıysanız, uzun bir boş çekilebilir oluşturun ve LinearLayoutbölücü olarak ayarlayın :

    <LinearLayout
            android:showDividers="middle"
            android:divider="@drawable/empty_tall_divider"
...>...</LinearLayout>

empty_tall_divider.xml:

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <size
            android:height="40dp"
            android:width="0dp"/>
</shape>

LinearLayoutCompat kullanıyorsanız API <11'de kullanabilirsiniz: developer.android.com/reference/android/support/v7/widget/…
android geliştirici

5
şekli kare gibi yaparsanız, genişliği olan yeni bir tane oluşturmaya gerek kalmadan dikey ve yatay LinearLayouts'ta kullanabilirsiniz.
WarrenFaith

2
İşte bununla ilgili mükemmel bir blog yazısı: Cyril Mottier tarafından Android'de Izgara Aralığı
Richard Le Mesurier

1
Bir dizi görüşünüz varsa ve bazılarını çevirirseniz, bu çok daha iyidir GONE. Belirterek, android:showDividers="middle"yalnızca gerçekten ihtiyacınız olan alanı elde edersiniz.
DariusL

@DariusL d.android.com'da bu showDividers özniteliğini bulamıyorum, bunu kullanabileceğimizden emin misiniz?
Henry

35

Android artık görünümler arasında bir Uzay görünümü eklemeyi destekliyor . 4.0 ICS ve sonrasında kullanılabilir.


12
Görünüşe göre Android-Fairy sizi dinledi ve API 14'te bir "Uzay" görünümü oluşturdu :) ( developer.android.com/reference/android/widget/Space.html )
shaylh

LOL! Bu sadece bir zaman meselesiydi.
çalıştı

8
ancak görünüm başına bir boşluk bırakmanız gerekir; bu, tüm görünümler için bir boşluk bildirmekle aynı değildir.
Lay González

^ Çok doğru. Ancak, bir LinearLayout kullanıyorsanız, her alt görünüme uygulanacak bir ayırıcı ekleyebilirsiniz. Buraya bakın: developer.android.com/reference/android/widget/…
çalıştı

1
Bu bir cevap değil.
Stealth Haham

24

Aşağıdaki örnek programla ihtiyacınız olanı yapar. Sabit bir boyut kullandım (140.398).

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(140, 398);
        layoutParams.setMargins(24, 0, 24, 0);
        layout.addView(button,layoutParams);

Bunu aşağıda LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (140, 398) gibi bir ek adımla yapıyordum; layoutParams.setMargins (24, 0, 24, 0); ve sonra button1.setLayoutParams (layoutParams); layout.addView (düğme, layoutParams); .. addview 2 argüman alabileceğini bildirdiğiniz için teşekkür ederiz.
png

6

API Seviye 14'ten beri çizilebilir bir (şeffaf) ayırıcı ekleyebilirsiniz:

android:divider="@drawable/divider"
android:showDividers="middle"

ve gerisini sizin için halledecek!


1
Önce çekilebilir bir bölücü belirtmeniz mi gerekiyor yoksa sadece başka bir şeyle kullanamaz mısınız?
Tim Kist

8dpbu nereden geldi?
Yousha Aleayoub

1
@TimKist bence başka bir şey ile kullanabilirsiniz
teh.fonsi

Bu cevap yanlış çünkü android: dividerPadding doğrusal düzen çocukları arasındaki mesafeyi etkilemez. Bölücünün çocuklarla yüzleşmeyen kenarlarına dolgu uygular (örneğin dikey bir Doğrusal Düzen içindeki bir ayırıcıda sol ve sağ dolgu). Android belgeleri: developer.android.com/reference/android/widget/…
leorleor

2
@leorleor Haklısın. En iyi yol muhtemelen şeffaf olan bir çekmeceyi kullanmaktır. Cevabımı buna göre güncelledim.
teh.fonsi

4

Yerine LinearLayout.LayoutParamskullanın MarginLayoutParams. İşte belgeler.


LinearLayout.LayoutParams'da hangi özelliği ayarlayabilirim? Bu sınıfın "kenar boşlukları" veya "dolgu" ya da buna benzer bir şeye sahip olmadığı görülüyor mu?
ab11

LinearLayout.LayoutParamsuzanır MarginLayoutParamsve setMargins()yukarıda kullandığınız aynı yöntemi miras alır ...
Chris Fei

Ohhhhh, teşekkür ederim! Ben bakıyordum: android.view.ViewGroup.LayoutParams
ab11

3

Eğer kullanırsanız ActionBarSherlock , sen com.actionbarsherlock.internal.widget.IcsLinearLayout kullanabilirsiniz:

<com.actionbarsherlock.internal.widget.IcsLinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:divider="@drawable/list_view_divider"
        android:dividerPadding="2dp"
        android:showDividers="middle" >
...
</com.actionbarsherlock.internal.widget.IcsLinearLayout>

2

Çocuk Görünümü düzeninde dolgu kullanma.

Layout.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_margin="5dp"
          android:background="@drawable/backage_text"
          android:textColor="#999999"
           >

</TextView>

backage_text.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="@color/white"/>
    <corners android:radius="2dp"/>
    <stroke
        android:width="1dp"
        android:color="#999999"/>
    <padding
        android:bottom="5dp"
        android:left="10dp"
        android:right="10dp"
        android:top="5dp" />
</shape>

0

LayoutParamsÜst öğeyi alabilir ve LinearLayoutayrı ayrı görünümlere şu şekilde başvurabilirsiniz:

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(8,8,8,8);
  • SetMargins () öğesinin int veri türü olarak piksel aldığından emin olun. Bu nedenle, değerler eklemeden önce dp'ye dönüştürün
  • Yukarıdaki kod, wrap_content için yükseklik ve genişlik ayarlar. özelleştirebilirsiniz.

0

Aşağıdaki gibi bir görünüm ekledikten sonra Uzay widget'ı eklemeyi deneyin :

layout.addView(view)
val space = Space(context)
space.minimumHeight = spaceInterval
layout.addView(space)

0

Dinamik olarak yapmanın kolay bir yolu , çocuklara dolgu eklemektir . Eklenecek nesnenin üzerindeki .setPadding () öğesini kullanarak ayarlayabilirsiniz. Bu örnek, bir LinearLayout'a ImageView ekliyor:

LinearLayout userFeedLinearLayout = (LinearLayout) findViewById(R.id.userFeedLinearLayout);
imageView.setImageBitmap(bitmap);
imageView.setPadding(0, 30, 0, 30);
userFeedLinearLayout.addView(imageView);

Aşağıdaki resimde dolgu ile eklenen iki ImageView gösterilmektedir:

Çocuklarda Dolgu


-1

Düzeninizde etiketler varsa o metin için bir kapsayıcı. Bir satırı bölmek ve öğeler arasında boşluk bırakmak için her metnin sonuna "\ n" ekleyebilirsiniz.
Misal:

video?.text="Video NR1: ${obj.Titulo} \n" 
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.