LinearLayout 어린이 사이에 공간을 만드는 방법은 무엇입니까?


160

프로그래밍 방식으로 세로 선형 LinearLayout에 사용자 정의보기를 추가하고 있으며보기 사이에 약간의 공간이 필요합니다. setPadding (0, 1, 0, 1)을 CustomView 생성자에 추가하려고 시도했지만 아무런 효과가없는 것 같습니다. 어떤 충고?

* 여백을 사용해야한다고 지적되었습니다. 동적으로 뷰를 추가하고 있기 때문에 (XML이 아닌) 코드에서 여백을 설정해야합니다. 나는 이것을하는 방법이 아래에 있다고 생각하지만 작동하지 않습니다.

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

*편집하다. 또한 MarginLayoutParams를 매개 변수로 사용하여 뷰를 선형 레이아웃에 추가했습니다 (아래 참조). 이것은 또한 작동하지 않았습니다.

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

보기를 추가 할 XML 파일을 추가 한 경우 도움이 될 수 있습니다.
Dennis Winter

2
여기에 대한 훌륭한 블로그 게시물입니다 : 시릴 Mottier 안드로이드에 그리드 간격
리처드 르 Mesurier

답변:


131

당신은 android:layout_margin<Side>아이들에게 있어야 합니다. 패딩은 내부입니다.


원하는 여백을 사용하여 XML로보기를 정의하고 컨텐츠를 Java 코드로 적용하여 사전 정의 된보기를 절차 적으로 추가 할 수 있습니다.
Mike Yockey

나는 이것이 당신이 무엇을 의미하는지 명확하지 않습니다. XML로 customview를 정의해야합니까? 그러나 임의의 수의 사용자 정의보기를 동적으로 생성해야하며,이를 LinearLayout에 추가합니다.
ab11

2
MarginLayoutParams가 아닌 LayoutParams를 사용해보십시오.
Thomas

1
LinearLayout.LayoutParams에서 어떤 속성을 설정합니까? 그 클래스에 "여백"이나 "패딩"또는 이와 유사한 것이없는 것 같습니까?
ab11

@Thomas "Padding is internal"은 무슨 뜻입니까? 각 구성 요소마다 여백을 적용해야합니다. 중복 된 코드를 최소화하기 위해 피하려고합니다 (자식 구성 요소간에 동일한 간격이 사용됨)
OmGanesh

188

API> = 11 솔루션 :

패딩을 분배기에 통합 할 수 있습니다. 아무것도 사용하지 않는 경우 키가 큰 빈 드로어 블을 만들고 LinearLayout'분배기 로 설정하십시오 .

    <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을 사용하면 API <11에서 사용할 수 있습니다 : developer.android.com/reference/android/support/v7/widget/…
android developer

5
모양을 정사각형으로 만들면 너비가있는 새 모양을 만들 필요없이 세로 및 가로 LinearLayouts에서 사용할 수 있습니다.
WarrenFaith

2
여기에 대한 훌륭한 블로그 게시물입니다 : 시릴 Mottier 안드로이드에 그리드 간격
리처드 르 Mesurier

1
뷰가 있고 일부를 돌리면 훨씬 좋습니다 GONE. 지정 android:showDividers="middle"하면 실제로 필요한 공간 만 얻을 수 있습니다.
DariusL

@DariusL d.android.com에서이 showDividers 속성을 찾을 수 없습니다. 이것을 사용할 수 있습니까?
Henry

35

Android는 이제 보기 사이에 공간 보기 추가를 지원합니다 . 4.0 ICS부터 사용할 수 있습니다.


12
분명히 안드로이드 요정 당신을 듣고 API (14) : (에 "공간"뷰를 생성 developer.android.com/reference/android/widget/Space.html )
shaylh

롤! 그것은 단지 시간 문제였습니다.
일에 근무 함

8
그러나 뷰당 공간에 있어야합니다. 이는 모든 뷰에 대한 간격을 선언하는 것과 다릅니다.
Lay González

^ 매우 그렇습니다. 그러나 LinearLayout을 사용하는 경우 각 하위 뷰에 적용되는 디바이더를 추가 할 수 있습니다. 여기를 참조하십시오 : developer.android.com/reference/android/widget/…
일함

1
이것은 대답이 아닙니다.
Stealth Rabbi

24

아래 샘플은 프로그래밍 방식으로 필요한 것을 수행합니다. 고정 크기 (140,398)를 사용했습니다.

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

아래의 LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (140, 398);와 같은 추가 단계로 수행했습니다. layoutParams.setMargins (24, 0, 24, 0); 그리고 button1.setLayoutParams (layoutParams); layout.addView (button, layoutParams); .. addview가 2 개의 인수를 사용할 수 있음을 알려 주셔서 감사합니다.
png

6

API 레벨 14부터 (투명한) 디바이더 드로어 블을 추가 할 수 있습니다.

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

그리고 그것은 당신을 위해 나머지를 처리합니다!


1
디바이더 드로어 블을 먼저 지정해야합니까 아니면 다른 용도로만 사용할 수 있습니까?
Tim Kist

8dp어디에서 왔을 까?
Yousha Aleayoub

1
@TimKist 당신은 다른 생각으로 그것을 사용할 수 있습니다
teh.fonsi

android : dividerPadding이 선형 레이아웃 하위 사이의 거리에 영향을 미치지 않기 때문에이 답변은 올바르지 않습니다. 어린이를 향하지 않는 분배기 측면에 패딩을 적용합니다 (예 : 수직 LinearLayout에서 분배기의 왼쪽 및 오른쪽 패딩). Android 설명서 : developer.android.com/reference/android/widget/…
leorleor

2
@leorleor 당신이 맞아요. 가장 좋은 방법은 투명한 분배기 서랍을 사용하는 것입니다. 이에 따라 답변을 업데이트했습니다.
teh.fonsi

4

LinearLayout.LayoutParams대신에 사용하십시오 MarginLayoutParams. 여기 문서가 있습니다.


LinearLayout.LayoutParams에서 어떤 속성을 설정합니까? 그 클래스에는 "여백"이나 "패딩"또는 이와 유사한 것이없는 것 같습니다.
ab11

LinearLayout.LayoutParams확장 MarginLayoutParams하고 그것은 setMargins()당신이 위에서 사용 했던 것과 같은 방법을 상속합니다 ...
Chris Fei

오, 고마워요! 내가보고있는 : android.view.ViewGroup.LayoutParams
ab11

3

ActionBarSherlock 을 사용하는 경우 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

Child View의 레이아웃에서 패딩 사용.

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으로 부모 중 하나 를 얻고 LinearLayout개별 뷰에 적용 할 수 있습니다 .

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(8,8,8,8);
  • setMargins ()는 픽셀을 int 데이터 형식으로 사용하므로 값을 추가하기 전에 dp로 변환하십시오.
  • 위의 코드는 높이와 너비를 wrap_content로 설정합니다. 당신은 그것을 사용자 정의 할 수 있습니다.

0

다음과 같이 뷰 를 추가 한 후 공간 위젯을 추가하십시오.

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

0

동적으로 수행하는 쉬운 방법 은 자식에 패딩을 추가하는 것 입니다. 추가 할 객체에서 .setPadding ()을 사용하여 설정할 수 있습니다. 이 예제는 LinearLayout에 ImageView를 추가합니다.

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

다음 이미지는 패딩으로 추가 된 두 개의 ImageView를 보여줍니다.

어린이 패딩


-1

레이아웃에 레이블이 포함 된 경우 텍스트 용 컨테이너입니다. 각 텍스트 끝에 "\ n" 을 추가하여 줄을 나누고 요소 사이에 공간을 만들 수 있습니다.
예:

video?.text="Video NR1: ${obj.Titulo} \n" 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.