Làm thế nào để tạo không gian giữa trẻ em tuyến tính?


159

Tôi lập trình thêm các chế độ xem tùy chỉnh vào Tuyến tính theo chiều dọc và tôi muốn có một khoảng trống giữa các chế độ xem. Tôi đã thử thêm: setPadding (0, 1, 0, 1) vào hàm tạo CustomView của tôi, nhưng điều này dường như không có bất kỳ ảnh hưởng nào. Có lời khuyên nào không?

* Nó đã chỉ ra rằng tôi nên sử dụng lề. Vì tôi đang tự động thêm các chế độ xem, tôi cần đặt lề từ mã (không phải trong xml). Tôi tin rằng cách để làm điều này là dưới đây, nhưng nó không hoạt động.

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

*Biên tập. Tôi cũng đã thử sử dụng MarginLayoutParams làm tham số trong khi thêm các khung nhìn vào bố cục tuyến tính (như bên dưới). Điều này cũng không hoạt động:

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

Nó có thể hữu ích nếu bạn đã thêm tệp XML mà bạn muốn thêm các khung nhìn.
Dennis Winter

2
Đây là một bài đăng blog tuyệt vời về nó: Grid Spaces trên Android của Cyril Mottier
Richard Le Mesurier

Câu trả lời:


131

Bạn nên android:layout_margin<Side>về trẻ em. Đệm là nội bộ.


Bạn có thể định nghĩa khung nhìn trong XML với các lề mong muốn và thêm các khung nhìn được xác định trước theo quy trình, cũng áp dụng nội dung trong mã Java.
Mike Y Racer

Tôi không thực sự rõ ràng về ý của bạn về điều này. Tôi nên xác định customview trong xml? Nhưng tôi sẽ cần phải tự động tạo một số lượt xem tùy chỉnh tùy ý, sau đó tôi sẽ thêm vào linearLayout của mình.
ab11

2
Hãy thử chỉ sử dụng LayoutParams chứ không phải MarginLayoutParams.
Thomas

1
Thuộc tính nào tôi sẽ đặt trong linearLayout.LayoutParams? Lớp đó dường như không có "lề" hay "đệm" hay bất cứ thứ gì tương tự?
ab11

@Thomas bạn có ý gì khi nói "Đệm là nội bộ". Tôi có nên áp dụng ký quỹ cho từng thành phần mà tôi đang cố gắng tránh để giảm thiểu các mã trùng lặp (vì tôi có khoảng cách bằng nhau được sử dụng giữa các thành phần con của tôi)
OmGanesh

187

Giải pháp API> = 11 :

Bạn có thể tích hợp phần đệm vào dải phân cách. Trong trường hợp bạn không sử dụng, chỉ cần tạo một LinearLayoutngăn kéo trống cao và đặt nó làm bộ chia:

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

blank_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>

Bạn có thể sử dụng nó trên API <11, nếu bạn sử dụng linearLayoutCompat: developer.android.com/reference/android/support/v7/widget/
nhà phát triển Android

5
nếu bạn tạo hình dạng như hình vuông, bạn có thể sử dụng nó trong linearLayouts dọc và ngang mà không cần phải tạo hình mới có chiều rộng.
WarrenFaith

2
Đây là một bài đăng blog tuyệt vời về nó: Grid Spaces trên Android của Cyril Mottier
Richard Le Mesurier

1
Điều này sẽ tốt hơn nhiều nếu bạn có một tập hợp các lượt xem và biến một số trong số chúng GONE. Bằng cách chỉ định android:showDividers="middle"bạn sẽ chỉ có được không gian nơi bạn thực sự cần nó.
DariusL

@DariusL Tôi không thể tìm thấy thuộc tính showDividers này trong d.android.com, bạn có chắc chúng ta có thể sử dụng cái này không?
Henry

35

Android hiện hỗ trợ thêm chế độ xem Không gian giữa các chế độ xem. Nó có sẵn từ 4.0 ICS trở đi.


12
Rõ ràng Android-Fairy đã lắng nghe bạn và tạo ra chế độ xem "Không gian" trong API 14 :) ( developer.android.com/reference/android/widget/Space.html )
shaylh

CƯỜI LỚN! Đó chỉ là vấn đề thời gian.
làm việc

8
nhưng bạn cần ở một khoảng trống trên mỗi khung nhìn, không giống như khai báo một khoảng trống cho tất cả các khung nhìn.
Lay González

^ Rất đúng. Tuy nhiên, nếu bạn đang sử dụng linearLayout, bạn có thể thêm một bộ chia sẽ được áp dụng cho mỗi chế độ xem con. Xem tại đây: developer.android.com/reference/android/widget/
làm việc

1
Đây không phải là một câu trả lời.
Rabbi tàng hình ngày

24

Các mẫu dưới đây chỉ làm những gì bạn cần lập trình. Tôi đã sử dụng một kích thước cố định là (140.398).

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

Tôi đã thực hiện nó với một bước nữa như bên dưới linearLayout.LayoutParams layoutParams = new linearLayout.LayoutParams (140, 398); layoutParams.setMargins (24, 0, 24, 0); và sau đó là nút1.setLayoutParams (layoutParams); layout.addView (nút, layoutParams); .. Cảm ơn đã cho biết rằng addview có thể mất 2 đối số.
png

6

Vì API cấp 14, bạn chỉ có thể thêm một dải phân cách (trong suốt) có thể vẽ:

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

và nó sẽ xử lý phần còn lại cho bạn!


1
Bạn có cần chỉ định một dải phân cách có thể vẽ trước hay bạn chỉ có thể sử dụng nó mà không có gì khác?
Tim Kist

8dpcái này đến từ đâu
Yousha Aleayoub

1
@TimKist bạn có thể sử dụng nó mà không có gì khác tôi nghĩ
teh.fonsi

Câu trả lời này không chính xác vì android: spliterPadding không ảnh hưởng đến khoảng cách giữa các bố cục tuyến tính. Nó áp dụng phần đệm cho các cạnh của dải phân cách không phải đối mặt với trẻ em (ví dụ: phần đệm bên trái và bên phải trên dải phân cách trong linearLayout dọc). Tài liệu Android: developer.android.com/reference/android/widget/
leorleor

2
@leorleor Bạn nói đúng. Cách tốt nhất có lẽ là sử dụng dải phân cách có thể vẽ trong suốt. Tôi cập nhật câu trả lời của tôi cho phù hợp.
teh.fonsi

4

Sử dụng LinearLayout.LayoutParamsthay vì MarginLayoutParams. Đây là tài liệu.


Thuộc tính nào tôi sẽ đặt trong linearLayout.LayoutParams? Lớp đó dường như không có "lề" hay "đệm" hay bất cứ thứ gì tương tự?
ab11

LinearLayout.LayoutParamsmở rộng MarginLayoutParamsvà nó kế thừa cùng một setMargins()phương pháp bạn đang sử dụng ở trên ...
Chris Fei

Ohhhhh, cảm ơn bạn! Tôi đã xem tại: android.view.Viewgroup.LayoutParams
ab11

3

Nếu bạn sử dụng ActionBarSherlock , bạn có thể sử dụng 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>

2

Sử dụng phần đệm trong bố cục của Chế độ xem trẻ em.

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 văn bản

<?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

Bạn có thể lấy LayoutParamscha mẹ LinearLayoutvà áp dụng cho các chế độ xem riêng lẻ theo cách này:

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(8,8,8,8);
  • Cẩn thận rằng setMargins () lấy pixel làm kiểu dữ liệu int. Vì vậy, hãy chuyển đổi sang dp trước khi thêm giá trị
  • Mã ở trên sẽ đặt chiều cao và chiều rộng thành quấn_content. bạn có thể tùy chỉnh nó.

0

Hãy thử thêm tiện ích Space sau khi thêm chế độ xem như thế này:

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

0

Một cách dễ dàng để làm điều đó một cách linh hoạt là thêm phần đệm cho trẻ em . Bạn chỉ có thể đặt nó bằng cách sử dụng .setPadding () trên đối tượng cần thêm. Ví dụ này đang thêm ImageView vào linearLayout:

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

Hình ảnh sau đây cho thấy hai ImageView đã được thêm vào với phần đệm:

Đệm cho trẻ em


-1

Nếu bố cục của bạn chứa nhãn o một số container cho văn bản. Bạn có thể thêm vào cuối mỗi văn bản "\ n" để phân chia một dòng và tạo khoảng trắng giữa các thành phần.
Thí dụ:

video?.text="Video NR1: ${obj.Titulo} \n" 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.