如何在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文件添加到其中,可能会有所帮助。
丹尼斯·温特2010年

2
这是一篇很棒的博客文章:Cyril Mottier撰写的Android网格间距
Richard Le Mesurier

Answers:


131

你应该android:layout_margin<Side>对孩子们。填充是内部的。


您可以使用所需的边距在XML中定义视图,并以程序方式添加预定义的视图,并以Java代码形式应用内容。
Mike Yockey,2010年

我不清楚您的意思。我应该在xml中定义customview?但是我将需要动态创建任意数量的自定义视图,然后将其添加到我的LinearLayout中。
2010年

2
尝试仅使用LayoutParams而不是MarginLayoutParams。
托马斯

1
我要在LinearLayout.LayoutParams中设置什么属性?该课程似乎没有“边距”或“填充”或类似内容?
2010年

@Thomas“填充是内部的”是什么意思。我应该在每个组件中应用边距,还是为了避免重复代码(因为我的子组件之间要使用相等的间距),所以我试图避免这种情况
OmGanesh

188

API> = 11的解决方案:

您可以将填充集成到分隔器中。如果您不使用它,只需创建一个高大的空drawable并将其设置为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>

您可以使用它在API <11,如果你使用LinearLayoutCompat:developer.android.com/reference/android/support/v7/widget/...
Android开发者

5
如果使形状像正方形,则可以在垂直和水平LinearLayouts中使用它,而无需创建一个新的宽度。
WarrenFaith

2
这是一篇关于它的出色博客文章:Cyril Mottier撰写的Android网格间距
Richard Le Mesurier

1
如果您有一组视图并打开其中一些视图,则效果会更好GONE。通过指定,android:showDividers="middle"您将仅获得实际需要的空间。
DariusL '16

@DariusL我在d.android.com中找不到此showDividers属性,您确定我们可以使用此属性吗?
亨利

35

Android现在支持在视图之间添加空间视图。从4.0 ICS开始可用。


12
显然,Android的仙女听了你的话和API 14 :)(创造了一个“空间”的观点developer.android.com/reference/android/widget/Space.html
shaylh

大声笑!这只是时间问题。
2012年

8
但您需要为每个视图留出一定的空间,这与为所有视图声明一个间隙不同。
LayGonzález2014年

^非常正确。但是,如果您使用LinearLayout,则可以添加一个添加分隔线,该分隔线将应用于每个子视图。在这里看到:developer.android.com/reference/android/widget/...

1
这不是答案。
Stealth Rabbi'3

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 2012年

6

从API级别14开始,您可以仅添加一个(透明的)分隔器drawable:

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

它将为您处理其余的一切!


1
您需要先指定一个可绘制的分隔线,还是只能将其用于其他目的?
蒂姆·基斯

8dp这是哪里来的?
Yousha Aleayoub

1
@TimKist,您可以将其用于其他任何用途
teh.fonsi

这个答案是错误的,因为android:dividerPadding不会影响线性布局子项之间的距离。它将填充应用于分隔符的不面向子对象的侧面(例如,垂直LinearLayout中分隔符的左右填充)。Android文档:developer.android.com/reference/android/widget/…–
leorleor

2
@leorleor你是对的。最好的方法可能是使用透明的分隔线drawable。我相应地更新了我的答案。
teh.fonsi

4

使用LinearLayout.LayoutParams代替MarginLayoutParams这是文档。


我要在LinearLayout.LayoutParams中设置什么属性?该课程似乎没有“边距”或“填充”或类似内容?
2010年

LinearLayout.LayoutParams扩展MarginLayoutParams,它继承了setMargins()上面使用的相同方法...
Chris Fei 2010年

哦,谢谢!我当时在看: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

在子视图的布局中使用填充。

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
  • 上面的代码将把height和width设置为wrap_content。您可以自定义它。


0

动态执行此操作的一种简单方法是为子级添加填充。您可以在要添加的对象上使用.setPadding()进行设置。本示例将ImageView添加到LinearLayout中:

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" 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.