在 RelativeLayout 中将多个项目居中而不将它们放入容器中?
Posted
技术标签:
【中文标题】在 RelativeLayout 中将多个项目居中而不将它们放入容器中?【英文标题】:Center multiple items in a RelativeLayout without putting them in a container? 【发布时间】:2012-01-22 10:12:29 【问题描述】:我有一个包含一对并排按钮的 RelativeLayout,我希望它们在布局中居中。我可以将按钮放在 LinearLayout 中并在 RelativeLayout 中居中,但我想让我的 xml 尽可能干净。
这是我尝试过的,这只是将“应用”按钮放在中间,将“撤消”按钮放在左边:
<RelativeLayout
android:layout_
android:layout_
android:layout_marginTop="15sp">
<TextView
android:id="@+id/instructions"
android:text="@string/instructions"
android:layout_
android:layout_
android:layout_marginBottom="15sp"
android:layout_centerHorizontal="true"
/>
<Button
android:id="@+id/apply"
android:layout_
android:layout_
android:layout_centerInParent="true"
android:text="@string/apply"
android:textSize="20sp"
android:layout_below="@id/instructions"
/>
<Button
android:id="@+id/undo"
android:layout_
android:layout_
android:layout_centerInParent="true"
android:text="@string/undo"
android:textSize="20sp"
android:layout_toLeftOf="@id/apply"
android:layout_below="@id/instructions"
/>
</RelativeLayout>
【问题讨论】:
【参考方案1】:android:gravity
将对齐使用它的view
或layout
内的内容。
android:layout_gravity
将对齐其父级内部的 view
或 layout
。
所以添加
android:gravity="center"
你的 RelativeLayout 应该可以解决问题...
像这样:
<RelativeLayout
android:layout_
android:layout_
android:gravity="center"
android:layout_marginTop="15sp">
</RelativeLayout>
【讨论】:
你能举个例子吗?我看不出这是如何工作的,因为您必须将一个按钮放在第二个按钮的左侧,反之亦然,这是一个循环依赖。这会在 RelativeLayout 中引发 IllegalStateException。 测试了自己...只需使用问题中的代码并像我说的那样添加行... 哦,我明白了,我将“RelativeLayout 中的中心”误解为垂直和水平 - 而不是文本视图下方的水平中心。那么这是有道理的。 如果下面还有其他项目且layout_width
设置为fill_parent
,则此方法不起作用。
如果你填满父母,就没有居中的空间......你的评论@Physikbuddha就像在说:如果你向左搅拌,你的车就不会直行。【参考方案2】:
这是 BrainCrash 答案的扩展。这是一个非嵌套选项,可将所有三个在水平和垂直方向上进行分组和居中。此外,它采用顶部 TextView 并在两个按钮上水平居中。如果需要,您可以在 TextView 中使用 android:gravity="center" 将文本居中。我还删除了边距,添加了颜色,并将 RelativeLayout 高度设置为 fill_parent 以突出显示布局。在 API 11 上测试。
<RelativeLayout
android:layout_
android:layout_
android:gravity="center"
android:background="@android:color/black"
>
<TextView
android:id="@+id/instructions"
android:text="TEST"
android:textSize="20sp"
android:background="@android:color/darker_gray"
android:layout_
android:layout_
android:layout_centerHorizontal="true"
android:layout_alignLeft="@+id/undo"
android:layout_alignRight="@+id/apply"
android:gravity="center"
/>
<Button
android:id="@+id/apply"
android:layout_
android:layout_
android:layout_centerInParent="true"
android:text="APPLY"
android:textSize="20sp"
android:layout_below="@id/instructions"
/>
<Button
android:id="@+id/undo"
android:layout_
android:layout_
android:layout_centerInParent="true"
android:text="UNDO"
android:textSize="20sp"
android:layout_toLeftOf="@id/apply"
android:layout_below="@id/instructions"
/>
</RelativeLayout>
【讨论】:
【参考方案3】:android:layout_gravity="center"
几乎可以满足您的需求。
【讨论】:
天啊,你回答这个问题的时间和 BrianCrash 完全一样。我对 b/c 投了反对票,我以为你抄袭了他的答案。对不起,伙计(我会尽力解决反对意见)!【参考方案4】:这是解决我的具体情况的上述答案的组合:
在布局中居中两个单独的标签,该布局还包括位于同一布局的最左侧位置的按钮(按钮、标签、标签,从左到右,其中标签相对于包含所有三个视图的布局居中 -也就是说,按钮不会将标签推离中心)。
我通过嵌套两个 RelativeLayout 解决了这个问题,其中最外面的布局包括 按钮和内部相对布局。
Inner-RelativeLayout 包含两个文本标签(TextView)。
这是一个 sn-p,它提供了如何完成居中和其他布局的详细信息:
见:RelativeLayout Gravity not applied? 和 Gravity and layout_gravity on Android 对于重力和 layout_gravity 之间的差异。
调整 btn_button1 Button 上的 paddingLeft 以查看 TextView 不会移动。
(我很抱歉 hasxz 的反对票。我太仓促了,认为只是 b/c 您的建议并不能解决所提出的确切问题,它们确实有助于解决非常相似的情况(这里的答案解决了一个非常具体的情况,只有所有这些答案的组合解决了我的问题。我尝试过投票,但除非我编辑答案,否则它不会让我这样做,我不想这样做。)
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rl_outer"
android:layout_
android:layout_
android:background="#FF0000FF">
<Button
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/btn_button1"
android:layout_
android:layout_
android:background="#FF00FF00"
android:text="<"
android:textSize="20sp"
android:paddingLeft="40dip"/>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rl_inner"
android:layout_
android:layout_
android:background="#FFFF00FF"
android:layout_centerInParent="true"
android:gravity="center">
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv_text1"
android:layout_
android:layout_
android:background="#FF505050"
android:textSize="20sp"
android:textColor="#FFFFFFFF"
android:text="Complaint #"
android:gravity="center"/>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv_text2"
android:layout_
android:layout_
android:background="#FF505050"
android:textSize="20sp"
android:textColor="#FFFFFFFF"
android:layout_toRightOf="@id/tv_text1"
android:gravity="center"/>
</RelativeLayout>
</RelativeLayout>
【讨论】:
【参考方案5】:LinearLayout
是一个不错的选择。除此之外,还有一些选项,例如创建一个不可见的视图并将其居中,然后将左按钮与它的左侧和右侧对齐。但这些只是变通方法。
【讨论】:
是的,这是一个丑陋的解决方法,但它是我发现的最好的。要么创建那个间隔视图,要么创建一个包含RelativeLayout/LinearLayout——所以无论哪种方式都需要扩展另一个视图,但这避免了嵌套视图组的开销。 @havexz 对不起,因为我确实合并了一个单独的布局来获得我需要的居中。我太草率地放弃了你的答案,因为这里的具体问题被 BrianCrash 的回答更“干净”地解决了。但是,当我进一步推动该解决方案时,它还不够。它也不会让我撤消或投票? @mindriot 弹出窗口指出我的投票已锁定,除非编辑答案,否则无法更改。只是为了改变我的投票而修改某人的答案是否合适? 有趣,不知道有这个规则。 meta.stackexchange.com/questions/75477/… @SamusArin 至于编辑某人的答案以更改投票,这是 Jeff Atwood 的回复。它是从 2009 年开始的,所以我把解释留给你。 meta.stackexchange.com/questions/28759/…以上是关于在 RelativeLayout 中将多个项目居中而不将它们放入容器中?的主要内容,如果未能解决你的问题,请参考以下文章
Android 代码设置RelativeLayout元素居中