Layout_Below未在relativelayout

时间:2016-07-31 13:27:32

标签: android layout relativelayout

我有以下xml代码。图像按钮未在textView下方对齐,边距为5dp。我想我在理解各种布局参数时犯了一个错误。 relativelayout是具有少量其他视图的线性布局的子视图。

        <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="40">

        <com.github.lzyzsd.circleprogress.DonutProgress
            android:id="@+id/amain_dp"
            android:layout_width="240dp"
            android:layout_height="240dp"
            android:layout_centerInParent="true" />

        <TextView
            android:id="@+id/amain_tv_currentsteps"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:textSize="25sp" />

        <ImageButton
            android:id="@+id/amain_ib_whatsapp"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_marginTop="5dp"
            android:layout_centerHorizontal="true"
            android:layout_below="@id/amain_tv_currentsteps"
            android:background="@drawable/whatsapp_icon"/>

    </RelativeLayout>

这是我得到的输出:

enter image description here

编辑:如果删除了layout_weight参数并且提供了固定的layout_height参数,则代码可以正常工作。但是想了解为什么上面的代码由于layout_weight

而失败了

编辑:完整的xml代码:

<ScrollView 
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_width="match_parent"
android:layout_height="match_parent"
tools:context="in.jiyofit.basic_app.MainActivity">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/amain_tv_target"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="20dp"
        android:layout_weight="10" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="40">

        <com.github.lzyzsd.circleprogress.DonutProgress
            android:id="@+id/amain_dp"
            android:layout_width="240dp"
            android:layout_height="240dp"
            android:layout_centerInParent="true" />

        <TextView
            android:id="@+id/amain_tv_currentsteps"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:textSize="25sp" />

        <ImageButton
            android:id="@+id/amain_ib_whatsapp"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_marginTop="5dp"
            android:layout_centerHorizontal="true"
            android:layout_below="@id/amain_tv_currentsteps"
            android:background="@drawable/whatsapp_icon"/>

    </RelativeLayout>

    <FrameLayout
        android:id="@+id/amain_fl_container"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="30"
        android:layout_marginTop="20dp"/>

</LinearLayout>

3 个答案:

答案 0 :(得分:1)

鉴于您的布局有以下方案:

<ScrollView>
    <LinearLayout>
        <TextView/>
        <RelativeLayout/>
        <FrameLayout/>
    </LinearLayout>
</ScrollView>

在上面的层次结构中,所有LinearLayout子项都有一个布局权重属性集,它基本上要求父级在父级内为其提供(layout_weight/weightSum) * parentHeight()空间,LinearLayout本身具有{ {1}}设置为lauout_height,它基本上要求孩子告诉他们的高度,以便wrap_content本身可以相应地扩展。这是一个循环依赖,因此布局工具无法确定位置。

在这种情况下,您有两个选择:

1 - 移除LinearLayout并将ScrollView高度设置为Linearlayout's。布局的每个子元素都会相应地拉伸以正确占用屏幕空间。您的布局将如下所示:

match_parent

2 - 由于您有<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:weightSum="80"> <TextView android:id="@+id/amain_tv_target" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_marginBottom="10dp" android:layout_marginTop="20dp" android:layout_weight="10"/> <RelativeLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="40"> <com.github.lzyzsd.circleprogress.DonutProgress android:id="@+id/amain_dp" android:layout_width="240dp" android:layout_height="240dp" android:layout_centerInParent="true"/> <TextView android:id="@+id/amain_tv_currentsteps" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" android:textSize="25sp"/> <ImageButton android:id="@+id/amain_ib_whatsapp" android:layout_width="40dp" android:layout_height="40dp" android:layout_below="@id/amain_tv_currentsteps" android:layout_centerHorizontal="true" android:layout_marginTop="5dp"/> </RelativeLayout> <FrameLayout android:id="@+id/amain_fl_container" android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginTop="20dp" android:layout_weight="30"/> </LinearLayout> ,因此您可以为ScrollView的每个孩子提供绝对高度,并让LinearLayout身高为LinearLayout。对于不同的屏幕,wrap_content会相应地适当缩放您的布局。您的布局可能如下所示:

ScrollView

根据经验,在向其子项提供<ScrollView 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_width="match_parent" android:layout_height="match_parent"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:weightSum="80"> <TextView android:id="@+id/amain_tv_target" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:layout_marginTop="20dp"/> <RelativeLayout android:layout_width="match_parent" android:layout_height="400dp"> <com.github.lzyzsd.circleprogress.DonutProgress android:id="@+id/amain_dp" android:layout_width="240dp" android:layout_height="240dp" android:layout_centerInParent="true"/> <TextView android:id="@+id/amain_tv_currentsteps" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" android:textSize="25sp"/> <ImageButton android:id="@+id/amain_ib_whatsapp" android:layout_width="40dp" android:layout_height="40dp" android:layout_below="@id/amain_tv_currentsteps" android:layout_centerHorizontal="true" android:layout_marginTop="5dp"/> </RelativeLayout> <FrameLayout android:id="@+id/amain_fl_container" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="20dp"/> </LinearLayout> </ScrollView> 属性之前,请确保LinearLayout的高度/宽度(如果可确定)。希望这会有所帮助。

答案 1 :(得分:0)

你需要使用+ 像这样:

 android:layout_below="@+id/amain_tv_currentsteps"

答案 2 :(得分:0)

在你的顶部RelativeLayout给它一个大小0dp会产生问题,因为它(rel的高度为0)你的图像视图低于它。

android:layout_height="match_parent"