Android:2相对布局分为半屏

Posted

技术标签:

【中文标题】Android:2相对布局分为半屏【英文标题】:Android: 2 relative layout divided in half screen 【发布时间】:2013-11-27 19:10:16 【问题描述】:

我试了很多次,画了2个相对布局,水平对齐,分成半屏。

我用油漆设计图像以更好地解释我的意思。

有什么建议吗?

【问题讨论】:

您现在可以使用Constrain Layout 来执行此类操作。 【参考方案1】:

另一种无需使用 LinearLayout 即可完成相同任务的方法是在父布局的中间放置一个居中对齐的“shim”,然后将其他元素与其对齐。如果将半角元素的宽度设置为 match_parent,但同时对齐它们的左右两侧,它们最终会缩小以适应。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.EqualWidthExample" >

    <!-- An invisible view aligned to the center of the parent. Allows other
    views to be arranged on either side -->
    <View 
        android:id="@+id/centerShim"
        android:layout_
        android:layout_
        android:visibility="invisible"
        android:layout_centerHorizontal="true"/>

    <!--Set width to match_parent sets maximum width. alignParentLeft aligns 
    the left edge of this view with the left edge of its parent. toLeftOf 
    sets the right edge of this view to align with the left edge of the 
    given view. The result of all three settings is that this view will 
    always take up exactly half of the width of its parent, however wide 
    that may be. -->
    <Button
        android:id="@+id/btLeft"
        android:layout_
        android:layout_
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@+id/centerShim"
        android:text="Left Button" />

    <!--Same deal, but on the right -->
    <Button
        android:id="@+id/btRight"
        android:layout_
        android:layout_
        android:layout_alignParentRight="true"
        android:layout_toRightOf="@+id/centerShim"
        android:layout_below="@+id/tvLeft"
        android:text="Right Button" />
</RelativeLayout>

【讨论】:

最好在centerShim视图中设置高度android:layout_height="0dp" +5 这种方式对于视图层次结构比 LinearLayout + layout_weight 更有效 还有 android:gravity="center" 完美居中两个按钮【参考方案2】:

您可以将这 2 个 RelativeLayouts 放在具有水平方向的 LinearLayout 中,然后将 weight 用于这两个 RelativeLayouts。这会将 LinearLayout 分成两等份。

<LinearLayout
    android:layout_
    android:layout_
    android:orientation="horizontal"
    android:baselineAligned="false">
    <RelativeLayout
        android:layout_
        android:layout_
        android:layout_weight="1">
   </RelativeLayout>
   <RelativeLayout
        android:layout_
        android:layout_
        android:layout_weight="1">
   </RelativeLayout>
</LinearLayout>

【讨论】:

@V.Kalyuzhnyu 一定要发布你更好的版本,我相信它会比光速更快地被投票...... ))) 你的答案是正确的,但最好拒绝投资布局,因为它们会为占用的空间调用多次重绘 这是一个很好的答案。如果您添加android:layout_gravity="center",那么当您将任一内部布局中的可见性设置为GONE 时,剩余的可见布局将很好地水平居中。不用太担心layout_weight 的使用,我敢肯定还有更多其他领域需要担心性能恕我直言。 我发现@KevBry 的想法 (***.com/a/22362494/1346778) 更简单、更高效。太糟糕了,它错过了被接受的答案【参考方案3】:

现在您可以使用 PercentRelativeLayout 轻松做到这一点

<android.support.percent.PercentRelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:padding="16dp"
tools:context=".MainActivity">


<Button
    android:id="@+id/button"
    android:layout_
    android:layout_centerVertical="true"
    android:text="Button"
    app:layout_widthPercent="50%"/>

<Button
    android:id="@+id/button2"
    android:layout_
    android:layout_centerVertical="true"
    android:layout_toRightOf="@id/button"
    android:text="Button 2"
    app:layout_widthPercent="50%"/>
</android.support.percent.PercentRelativeLayout>

别忘了添加 gradle 依赖

dependencies 
     compile 'com.android.support:percent:25.3.1'

code in github

更新

PercentRelativeLayout is Deprecated since API level 26.0.0

【讨论】:

【参考方案4】:

您可以使用不推荐的结构与嵌套的 wieghts

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="vertical"
    android:baselineAligned="false"
    android:weightSum="5">
    <RelativeLayout
        android:layout_
        android:layout_
        android:layout_weight="1"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:layout_gravity="center">
        <TextView
            android:id="@+id/TopTextView"
            android:layout_
            android:layout_
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="Top Text View"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="5dp"/>

    </RelativeLayout>
    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="horizontal"
        android:weightSum="2"
        android:layout_weight="4">

        <RelativeLayout
            android:layout_
            android:layout_
            android:layout_weight="1"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:paddingTop="@dimen/activity_vertical_margin"
            android:paddingBottom="@dimen/activity_vertical_margin">
            <TextView
                android:id="@+id/LeftTextView"
                android:layout_
                android:layout_
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:text="Left Text View"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="30dp"/>

        </RelativeLayout>
        <RelativeLayout
            android:layout_
            android:layout_
            android:layout_weight="1"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:paddingTop="@dimen/activity_vertical_margin"
            android:paddingBottom="@dimen/activity_vertical_margin">
                <TextView
                    android:id="@+id/RightTextView"
                    android:layout_
                    android:layout_
                    android:textAppearance="?android:attr/textAppearanceLarge"
                    android:text="Right Text View"
                    android:layout_centerHorizontal="true"
                    android:layout_marginTop="30dp"/>
        </RelativeLayout>
    </LinearLayout>
</LinearLayout>

【讨论】:

【参考方案5】:

我在您的绘图中看到 4 个相对布局...?

如果你的意思是把中间的两个放在一个 LinearLayout 中(水平方向),让它们都具有 match_parent 的宽度,并给两个相对布局的权重 1

【讨论】:

以上是关于Android:2相对布局分为半屏的主要内容,如果未能解决你的问题,请参考以下文章

Android之相对布局

Android布局---相对布局

§2.2 七大布局------相对布局(RelativeLayout)

2.2相对布局

Android_layout 布局

Android 开发 -- 开发第一个安卓程序Android UI开发(布局的创建:相对布局和线性布局控件单位:px pt dp sp常用控件 常见对话框ListView)