【问题标题】:How to make space between LinearLayout children?如何在 LinearLayout 子级之间留出空间?
【发布时间】:2011-05-14 15:41:30
【问题描述】:

我正在以编程方式将自定义视图添加到垂直 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);

【问题讨论】:

标签: android


【解决方案1】:

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>

【讨论】:

  • 你可以在 APIdeveloper.android.com/reference/android/support/v7/widget/…
  • 如果你把形状做成正方形,你可以在垂直和水平的LinearLayouts中使用它,而不需要创建一个有宽度的新布局。
  • 这是一篇很棒的博客文章:Grid Spacing on Android by Cyril Mottier
  • 如果您有一组视图并将其中一些视图转为GONE,这会更好。通过指定android:showDividers="middle",您只会获得实际需要的空间。
  • @DariusL 我在 d.android.com 中找不到这个 showDividers 属性,你确定我们可以使用它吗?
【解决方案2】:

您应该对孩子们android:layout_margin&lt;Side&gt;。填充是内部的。

【讨论】:

  • 您可以在 XML 中定义具有所需边距的视图,并以程序方式添加预定义的视图,同时应用 Java 代码中的内容。
  • 我不太清楚你的意思。我应该在xml中定义customview吗?但我需要动态创建任意数量的自定义视图,然后将其添加到我的 LinearLayout。
  • 尝试只使用 LayoutParams 而不是 MarginLayoutParams。
  • 我将在 LinearLayout.LayoutParams 中设置什么属性?该类似乎没有“边距”或“填充”或类似的东西?
  • @Thomas “填充是内部的”是什么意思。我是否应该在每个组件中应用边距,我试图避免这种情况以尽量减少重复代码(因为我的子组件之间使用相等的间距)
【解决方案3】:

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

【讨论】:

【解决方案4】:

下面的示例只是以编程方式满足您的需求。我使用了 (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 个参数。
【解决方案5】:

从 API 级别 14 开始,您只需添加一个(透明的)可绘制分隔线:

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

它会为你处理剩下的事情!

【讨论】:

  • 您需要先指定一个可绘制的分隔线,还是可以只使用它而不使用其他任何东西?
  • 8dp 这是哪里来的?
  • @TimKist 你可以使用它,我认为别无其他
  • 这个答案不正确,因为 android:dividerPadding 不会影响线性布局子级之间的距离。它将填充应用于不面向子元素的分隔线的侧面(例如,垂直线性布局中分隔线的左右填充)。 Android 文档:developer.android.com/reference/android/widget/…
  • @leorleor 你是对的。最好的方法可能是使用透明的可绘制分隔线。我相应地更新了我的答案。
【解决方案6】:

使用LinearLayout.LayoutParams 而不是MarginLayoutParamsHere's 文档。

【讨论】:

  • 我将在 LinearLayout.LayoutParams 中设置什么属性?该类似乎没有“边距”或“填充”或类似的东西?
  • LinearLayout.LayoutParams extends MarginLayoutParams 并继承了您在上面使用的相同 setMargins() 方法...
  • 哦,谢谢!我在看:android.view.ViewGroup.LayoutParams
【解决方案7】:

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

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>

【讨论】:

    【解决方案8】:

    如果你使用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>
    

    【讨论】:

      【解决方案9】:

      添加视图后尝试添加 Space 小部件,如下所示:

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

      【讨论】:

        【解决方案10】:

        您只需要使用具有 layout_weight 的线性布局来包装项目。要水平分隔项目,请使用此

        <LinearLayout
            ...
            ...
          <LinearLayout
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:layout_weight="1"
              android:gravity="center">
        
              // your item
        
          </LinearLayout>
        </LinearLayout>
        

        【讨论】:

        • 如果我没记错的话,孩子们需要有 layout:width="match_parent" 和 layout_weight="x" (x 是任意的,只需要相同。)然后你实际上可以省略线性布局的 layout_weight。
        【解决方案11】:

        您可以通过这种方式获取父级LinearLayoutLayoutParams 并应用于各个视图:

        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。你可以自定义它。

        【讨论】:

          【解决方案12】:

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

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

          下图显示了两个添加了 padding 的 ImageView:

          【讨论】:

            【解决方案13】:

            如果您的布局包含标签或一些文本容器。您可以在每个文本的末尾添加 "\n" 来分割一行并在元素之间留出空间。
            示例:

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

            【讨论】: