在 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 将对齐使用它的viewlayout 内的内容。

android:layout_gravity 将对齐其父级内部的 viewlayout

所以添加

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="&lt;"
    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 中将多个项目居中而不将它们放入容器中?的主要内容,如果未能解决你的问题,请参考以下文章

RelativeLayout不能居中的解决的方法

Android 代码设置RelativeLayout元素居中

如何在 Flutter 中将 gridView 项目居中?

在颤动的网格视图中将最后一行项目居中

如何在jetpack compose中将项目居中在Surface内

ListView内嵌套RelativeLayout中的垂直居中