Bagaimana cara membuat ruang di antara anak-anak LinearLayout?

160

Saya secara terprogram menambahkan tampilan kustom ke LinearLayout vertikal, dan saya ingin ada ruang di antara tampilan. Saya telah mencoba menambahkan: setPadding (0, 1, 0, 1) ke konstruktor CustomView saya, tetapi ini tampaknya tidak berpengaruh. Ada saran?

* Menunjukkan bahwa saya harus menggunakan margin. Karena saya menambahkan pandangan secara dinamis, saya perlu mengatur margin dari kode (bukan dalam xml). Saya percaya cara untuk melakukan ini ada di bawah, tetapi tidak berhasil.

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

* Edit. Saya juga mencoba menggunakan MarginLayoutParams sebagai parameter sambil menambahkan pandangan ke tata letak Linear (seperti di bawah). Ini juga tidak berhasil:

MarginLayoutParams params = new MarginLayoutParams(linearLayout.getLayoutParams());
linearLayout.setMargins(0, 10, 0, 10);
linearLayout.addView(view, params);
ab11
sumber
Mungkin membantu jika Anda menambahkan file XML yang ingin Anda tambahkan tampilan.
Dennis Winter
2
Berikut ini adalah posting blog yang luar biasa tentang hal ini: Spacing Kotak di Android oleh Cyril Mottier
Richard Le Mesurier

Jawaban:

132

Anda harus android:layout_margin<Side>pada anak-anak. Padding bersifat internal.

Thomas
sumber
Anda dapat mendefinisikan tampilan dalam XML dengan margin yang diinginkan dan menambahkan tampilan yang telah ditentukan sebelumnya secara prosedural, menerapkan konten dalam kode Java juga.
Mike Yockey
Saya tidak begitu jelas tentang apa yang Anda maksudkan dengan ini. Saya harus mendefinisikan customview dalam xml? Tapi saya perlu secara dinamis membuat sejumlah tampilan kustom sewenang-wenang, yang kemudian akan saya tambahkan ke LinearLayout saya.
ab11
2
Coba gunakan LayoutParams bukan MarginLayoutParams.
Thomas
1
Atribut apa yang akan saya atur di LinearLayout.LayoutParams? Kelas itu tampaknya tidak memiliki "margin" atau "padding" atau yang serupa?
ab11
@ Thomas apa yang Anda maksud dengan "Padding internal". Haruskah saya menerapkan margin di setiap komponen, yang saya coba hindari untuk meminimalkan kode duplikat (karena saya memiliki jarak yang sama untuk digunakan di antara komponen anak saya)
OmGanesh
188

The API> = 11 solusi:

Anda dapat mengintegrasikan padding ke dalam pembagi. Jika Anda tidak menggunakannya, buat saja drawable kosong yang tinggi dan tetapkan sebagai LinearLayoutpembagi:

    <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>
riwnodennyk
sumber
Anda dapat menggunakannya di API <11, jika Anda menggunakan LinearLayoutCompat: developer.android.com/reference/android/support/v7/widget/…
pengembang android
5
jika Anda membuat bentuk seperti persegi, Anda dapat menggunakannya dalam LinearLayout vertikal dan horizontal tanpa perlu membuat yang baru yang memiliki lebar.
WarrenFaith
2
Berikut ini adalah posting blog yang luar biasa tentang hal ini: Spacing Kotak di Android oleh Cyril Mottier
Richard Le Mesurier
1
Ini jauh lebih baik jika Anda memiliki seperangkat pandangan dan mengubahnya GONE. Dengan menentukan android:showDividers="middle"Anda hanya akan mendapatkan ruang di mana Anda benar-benar membutuhkannya.
DariusL
@DariusL Saya tidak dapat menemukan atribut showDividers ini di d.android.com, apakah Anda yakin kami dapat menggunakan ini?
Henry
35

Android sekarang mendukung penambahan tampilan Ruang antar tampilan. Ini tersedia mulai 4.0 ICS dan seterusnya.

bekerja
sumber
12
Rupanya Android-Fairy mendengarkan Anda dan menciptakan tampilan "Space" di API 14 :) ( developer.android.com/reference/android/widget/Space.html )
shaylh
LOL! Hanya masalah waktu saja.
bekerja
8
tetapi Anda harus pada ruang per tampilan, yang tidak sama dengan menyatakan celah untuk semua tampilan.
Lay González
^ Sangat benar. Namun jika Anda menggunakan LinearLayout, Anda bisa menambahkan pembagi yang akan diterapkan ke setiap tampilan anak. Lihat di sini: developer.android.com/reference/android/widget/…
bekerja
1
Ini bukan jawaban.
Stealth Rabbi
24

Sampel di bawah ini hanya melakukan apa yang Anda butuhkan secara terprogram. Saya telah menggunakan ukuran tetap (140.398).

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(140, 398);
        layoutParams.setMargins(24, 0, 24, 0);
        layout.addView(button,layoutParams);
Gorky
sumber
Saya melakukannya dengan satu langkah tambahan lagi seperti di bawah ini LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (140, 398); layoutParams.setMargins (24, 0, 24, 0); dan kemudian button1.setLayoutParams (layoutParams); layout.addView (tombol, layoutParams); .. Terima kasih telah memberi tahu bahwa addview dapat mengambil 2 argumen.
png
6

Sejak API Level 14, Anda bisa menambahkan drawer divider (transparan):

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

dan itu akan menangani sisanya untuk Anda!

teh.fonsi
sumber
1
Apakah Anda perlu menentukan pembagi yang dapat digambar terlebih dahulu atau dapatkah Anda menggunakannya tanpa yang lain?
Tim Kist
8dpdari mana ini berasal?
Yousha Aleayoub
1
@TimKist Anda dapat menggunakannya dengan apa pun yang saya kira
teh.fonsi
Jawaban ini salah karena android: dividerPadding tidak mempengaruhi jarak antara anak-anak tata letak linier. Ini berlaku padding ke sisi pembagi yang tidak menghadap anak-anak (misalnya padding kiri dan kanan pada pembagi dalam LinearLayout vertikal). Dokumentasi Android: developer.android.com/reference/android/widget/…
leorleor
2
@leorleor Anda benar. Cara terbaik mungkin adalah dengan menggunakan pembagi drawable yang transparan. Saya memperbarui jawaban saya sesuai.
teh.fonsi
4

Gunakan LinearLayout.LayoutParamssebagai ganti MarginLayoutParams. Berikut dokumentasinya.

Chris Fei
sumber
Atribut apa yang akan saya atur di LinearLayout.LayoutParams? Kelas itu tampaknya tidak memiliki "margin" atau "padding" atau yang serupa?
ab11
LinearLayout.LayoutParamsmeluas MarginLayoutParamsdan mewarisi setMargins()metode yang sama yang Anda gunakan di atas ...
Chris Fei
Ohhhhh, terima kasih! Saya sedang melihat: android.view.ViewGroup.LayoutParams
ab11
3

Jika Anda menggunakan ActionBarSherlock , Anda dapat menggunakan com.actionbarsherlock.internal.widget.IcsLinearLayout:

<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>
pengembang android
sumber
2

Menggunakan bantalan dalam tata letak Tampilan Anak.

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>
Francis Bacon
sumber
0

Anda bisa mendapatkan orang LayoutParamstua LinearLayoutdan menerapkan pandangan individual seperti ini:

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(8,8,8,8);
  • Berhati-hatilah bahwa setMargins () menggunakan piksel sebagai tipe data int. Jadi, konversikan ke dp sebelum menambahkan nilai
  • Kode di atas akan mengatur tinggi dan lebar untuk wrap_content. Anda dapat menyesuaikannya.
Harish Rana
sumber
0

Coba tambahkan widget Space setelah menambahkan tampilan seperti ini:

layout.addView(view)
val space = Space(context)
space.minimumHeight = spaceInterval
layout.addView(space)
Oleg Nekrasov
sumber
0

Cara mudah untuk melakukannya secara dinamis adalah dengan menambahkan padding pada anak-anak . Anda bisa mengaturnya menggunakan .setPadding () pada objek yang akan ditambahkan. Contoh ini menambahkan ImageView ke LinearLayout:

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

Gambar berikut menunjukkan dua ImageViews yang telah ditambahkan dengan padding:

Padding On Children

HOBbit yang peduli
sumber
-1

Jika tata letak Anda berisi label o beberapa wadah untuk teks. Anda dapat menambahkan di akhir setiap teks "\ n" untuk membagi satu baris dan membuat spasi antar elemen.
Contoh:

video?.text="Video NR1: ${obj.Titulo} \n" 
Gian Gomen
sumber