如何只指定一次LinearLayout的元素之间的间距?

23 人关注

我最近又遇到了一个问题,在过去几年中我已经遇到过几次。

LinearLayout是一个非常方便的layout manager。但我完全怀念的是,在单个XML标签中,可以在元素之间添加一定的空间(如padding)。

我所说的一个标签的意思是,我可以在LinearLayout的声明中定义元素之间的间距(例如,在一个垂直的LinearLayout中,这个布局中两个元素之间的垂直空间)。

我知道我可以通过为LinearLayout中的每个元素添加XML标签android:layout_marginTop或类似的东西来实现。

但我希望能够只用一个点来定义它,因为所有元素的间距都是一样的。

有谁知道有什么简单的方法可以做到这一点(不是实现一个自定义的LinearLayout或类似的东西)?我更喜欢直接在XML中工作而不需要编码的解决方案。

2 个评论
对于任何其他寻找一个单一地点解决方案.
这里有一篇关于它的优秀博文。安卓上的网格间距 by Cyril Mottier
android
android-layout
android-widget
android-linearlayout
Dude
Dude
发布于 2012-09-17
6 个回答
chris-tulip
chris-tulip
发布于 2022-09-20
已采纳
0 人赞同

推荐的方法是对线性布局中的所有元素应用一个样式。

android:style="@style/mystyle"

<style name="mystyle">
      <item name="android:layout_marginTop">10dp</item>
      ... other things that your elements have in common
</style>
Dude
谢谢@MrFox。这正是我在寻找的解决方案。
我也有和OP一样的问题。然而,我不确定这种方法如何实现我所寻找的目标。例如,如果我的LinearLayout里有10个文本视图,而我希望它们之间的间距为10dp,我希望能够在一个地方指定10dp的设置。如果我像你的例子那样定义一个样式,我仍然要把这个样式应用到所有的10个文本视图。我在这里错过了什么吗?
@AngieM 用这个苏泊尔答案它建议使用LinearLayout的分隔器来在LL的孩子之间应用均匀的间距。
不要自欺欺人--你只是在LinearLayout内对特定的元素进行间隔。例如,如果我需要动态地隐藏/显示其中的一些元素--间距将被打破(例如,如果我让第一个元素消失,我可能最终显示LinearLayout的顶部边距+第二个元素的分隔符间距(这是多余的))。在我看来,这是一个非常不可靠的解决方案
很公平,这是我在2012年发帖时的最佳解决方案 :)
Zon
Zon
发布于 2022-09-20
0 人赞同

设置自定义的透明可抽纸作为你的布局的分隔线。

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

在drawables文件夹(divider.xml)中新增可画资源。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android = "http://schemas.android.com/apk/res/android">
  <size
    android:width = "0dp"
    android:height = "16dp"/>
</shape>
伙计,这个答案比公认的答案要好得多。
Watercayman
Watercayman
发布于 2022-09-20
0 人赞同

@Chris-Tulip的回答真的帮助了我--也有很好的实践。

对于那些可能会像我一样收到Eclipse错误,说缺少包android中 "Style "的资源标识符的人,你不需要添加android命名空间。

所以。 android:styleing "xx "会出现错误,而styleing "xx "是正确的。 很奇怪,但对于有这种错误的人来说,这可能有帮助。

Yuriy Vasylenko
Yuriy Vasylenko
发布于 2022-09-20
0 人赞同

你应该为必须有缩进的元素添加android:layout_marginTopandroid:layout_marginLeft。这取决于你的android:orientationLinearLayout

dbm
dbm
发布于 2022-09-20
0 人赞同

你可以在一个单独的xml文件中定义你的单项 "原型",然后在代码中动态地将该文件中的项目充气,并将它们插入你的线性布局中。

然后,你将在实际的项目上定义间距,而不是在父线性布局上,(例如,作为一个android:layout_marginTop),当你膨胀它们时,该间距将被应用于所有的项目。

EDIT:

container.xml。

<LinearLayout
    android:id="@+id/parent"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Your items will be added here -->

</LinearLayout>

item.xml:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="4dp">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="This is my child" />

</LinearLayout>

MyActivity.java。

// Put this in a suitable place in your Java code, perhaps
// in "onCreate" or "onResume" depending on where and how
// you initialize your view. You can, of course inflate
// any number of instances of the item and add them to
// your parent LinearLayout.
LayoutInflater inflater = LayoutInflater.from(context);
View item = inflater.inflate(R.layout.item, null, false);

LinearLayout container = findViewById(R.id.parent);
container.addView(view);

我没有花力气测试这段代码,但它 "应该 "能按原样工作 :-)

Dude
谢谢dbm。谢谢你的漂亮的代码例子。我更喜欢直接在XML中工作的解决方案,但如果没有更好的解决方案出现,我就选择你的方案作为答案。
dbm
我理解。不幸的是,我不知道有一个纯XML的解决方案。
Fred
在安卓系统中永远不要使用5dp。总是使用4、8、16、32、48dp。developer.android.com/design/style/metrics-grids.html
Ilyas Arafath
Ilyas Arafath
发布于 2022-09-20
0 人赞同

对于垂直空间

<View
    android:layout_width="0dp"
    android:layout_height="20dp"/>

用于水平空间

<View
    android:layout_width="20dp"
    android:layout_height="0dp"/>

推荐产品

云服务器_QVM_云主机

云服务器_QVM_云主机

七牛云 QVM 以云服务器为核心,提供含云硬盘、云数据库、高防、负载均衡等解决方案为一体的云计算综合服务。
CDN_内容分发网络

CDN_内容分发网络

七牛 CDN 提供稳定快速的网络访问服务。保障您的音视频点播、大文件下载、应用及 Web 加速服务的稳定及连续性。
云存储_对象存储

云存储_对象存储

七牛云对象存储系统 kodo 支持中心和边缘存储,经过多年大规模用户验证已跻身先进技术行列,并广泛应用于海量数据管理的各类场景。
实时音视频通信_RTC

实时音视频通信_RTC

七牛实时音视频云为您提供一站式解决方案,零基础搭建音视频平台,快速支持视频通话、多人会议、互动直播、语音聊天室等多种业务场景。
页面原文内容由 Dude、chris-tulip 等提供。七牛云提供翻译支持。
如您不希望该内容被发布至本网站,请发送邮件至:ug#qiniu.com(邮箱中 # 请改为 @)进行申诉,一经确认,我们将立即删除该内容。