Android - 解决布局不一致所需的帮助(RelativeLayout和LinearLayout)

时间:2011-08-01 01:50:20

标签: android xml layout android-linearlayout relativelayout

我正在使用可重复使用的数字键盘构建应用程序。键盘已放置在自己的XML文件中,因此可以在整个应用程序中的所需位置包含它。我想将当前活动的屏幕分成两部分,底部是固定大小的数字键盘,上面是其他控件的RelativeLayout(RL)。

问题是,RL本身并不表现。在下面的示例中,RL占据整个屏幕,键盘不显示。真正奇怪的是当我颠倒放置时,将键盘放在顶部,屏幕显示为预期,键盘和RL各占约一半。

换句话说:当键盘位于顶部时,一切都很好(但键盘位于错误的位置);但是当我在底部包含键盘时,键盘没有显示,RL占据了整个屏幕。

帮助!这种不一致性使我疯狂,我即将把计算机扔到房间里。

活动的XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/statsTabLayout"
    android:scaleType="fitXY"
    android:background="#ffffff" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent" 
    android:baselineAligned="true" 
    android:orientation="vertical">

    <RelativeLayout android:id="@+id/statsTopLayout"
        android:background="#ffffff" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:orientation="vertical">


    <TextView android:id="@+id/textViewTopMargin" 
        android:text="                              " 
        android:textColor="#FFFFFF"
        android:textSize = "5sp"
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:layout_gravity="top"
        android:layout_alignParentLeft="true"
        android:paddingTop="0px"
    ></TextView>

    <TextView android:id="@+id/textViewAverage" 
        android:text="Average =    (%)" 
        android:textColor="#000000"
        android:textSize = "25sp"
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:paddingBottom="5px"
        android:layout_below="@+id/textViewTopMargin"
        android:layout_alignParentLeft="true"
    ></TextView>

    <Button android:id="@+id/buttonReset" 
        android:text="reset" 
        android:onClick="resetButtonClick" 
        android:textSize = "12sp"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignTop="@+id/textViewAverage" 
        android:layout_alignBottom="@+id/textViewAverage"
        android:layout_below="@+id/textViewTopMargin"
        android:layout_alignParentRight="true"
    ></Button>

    <TextView android:id="@+id/textViewHi" 
        android:text="High= " 
        android:textColor="#000000"
        android:textSize = "20sp"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:paddingBottom="5px"
        android:layout_below="@+id/textViewAverage"
        android:layout_alignParentLeft="true"
    ></TextView>

    <TextView android:id="@+id/textViewLow" 
        android:text="Low= " 
        android:textColor="#000000"
        android:textSize = "20sp"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:paddingBottom="5px"
        android:layout_below="@+id/textViewAverage"
        android:layout_centerHorizontal="true" 
    ></TextView>

    <TextView android:id="@+id/textViewMax" 
        android:text="Max= " 
        android:textColor="#000000"
        android:textSize = "20sp"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:paddingBottom="5px"
        android:layout_below="@+id/textViewAverage"
        android:layout_alignParentRight="true"
    ></TextView>

    <TextView android:id="@+id/textViewScore" 
        android:text="Score = " 
        android:textColor="#000000" 
        android:textSize = "30sp"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:paddingBottom="5px"
        android:layout_above="@+id/textViewScoreCalculation"
        android:layout_alignParentLeft="true"
    ></TextView>

    <TextView android:id="@+id/textViewScoreCalculation" 
        android:text="(score calculation)" 
        android:textColor="#000000"
        android:textSize = "20sp"
        android:textStyle="italic"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:paddingBottom="10px"
        android:layout_above="@+id/editTextPoints"
        android:layout_alignParentRight="true"
    ></TextView>

    <TextView android:id="@+id/textViewPoints" 
        android:text="Enter Points: " 
        android:textSize = "30sp"
        android:textColor="#000000"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_above="@+id/textViewBottomMargin"
        android:layout_alignParentLeft="true"
        android:paddingBottom="10px"
    ></TextView>

    <EditText android:id="@+id/editTextPoints" 
        android:text="" 
        android:digits="-0123456789."
        android:windowSoftInputMode="stateVisible"
        android:focusable="true"
        android:textSize = "30sp"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_alignTop="@+id/textViewPoints" 
        android:layout_alignBottom="@+id/textViewPoints"
        android:layout_above="@+id/textViewBottomMargin"
        android:layout_toRightOf="@+id/textViewPoints" 
        android:paddingBottom="10px"
    ></EditText>

    <TextView android:id="@+id/textViewBottomMargin" 
        android:text="                              " 
        android:textColor="#FFFFFF"
        android:textSize = "5sp"
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true" 
        android:paddingBottom="0px"
    ></TextView>


    </RelativeLayout>


    <include layout="@layout/numerickeyboard" />

</LinearLayout>

附带键盘的父布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="104pt" 
    android:id="@+id/numberPadLayoutContainer" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent"
    android:background="#404040"
    android:layout_alignParentBottom="true" 
>

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

可能是这样的情况,当您将键盘布局放在底部时,它将被渲染到屏幕外。通过将整个布局放入ScrollView,您可以轻松查看是否是这种情况。

我还建议您使用dp而不是pt值指定键盘的layout_height。否则,它可能在各种屏幕密度下看起来不正确。

答案 1 :(得分:0)

问题是RelativeLayout的某些子布局属性(例如layout_alignParentBottom="true")要求布局在布置要与其底部对齐的子项之前确定其自身的尺寸。实际上,当孩子要求alignParentBottom时,它会强制RelativeLayout使用它可用的所有垂直空间。

布局堆栈中最后几个项目位于最终元素TextView android:id="@+id/textViewBottomMargin"上方,定义为alignParentBottom。我修改了布局,修改了最后几个元素,使其在前一个项目下方对齐,而不是在最后一个项目上方对齐。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/statsTabLayout"
    android:scaleType="fitXY"
    android:background="#ffffff" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent" 
    android:baselineAligned="true" 
    android:orientation="vertical">

    <RelativeLayout android:id="@+id/statsTopLayout"
        android:background="#ffffff" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:orientation="vertical">


    <TextView android:id="@+id/textViewTopMargin" 
        android:text="                              " 
        android:textColor="#FFFFFF"
        android:textSize = "5sp"
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:layout_gravity="top"
        android:layout_alignParentLeft="true"
        android:paddingTop="0px"
    ></TextView>

    <TextView android:id="@+id/textViewAverage" 
        android:text="Average =    (%)" 
        android:textColor="#000000"
        android:textSize = "25sp"
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:paddingBottom="5px"
        android:layout_below="@+id/textViewTopMargin"
        android:layout_alignParentLeft="true"
    ></TextView>

    <Button android:id="@+id/buttonReset" 
        android:text="reset" 
        android:onClick="resetButtonClick" 
        android:textSize = "12sp"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignTop="@+id/textViewAverage" 
        android:layout_alignBottom="@+id/textViewAverage"
        android:layout_below="@+id/textViewTopMargin"
        android:layout_alignParentRight="true"
    ></Button>

    <TextView android:id="@+id/textViewHi" 
        android:text="High= " 
        android:textColor="#000000"
        android:textSize = "20sp"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:paddingBottom="5px"
        android:layout_below="@+id/textViewAverage"
        android:layout_alignParentLeft="true"
    ></TextView>

    <TextView android:id="@+id/textViewLow" 
        android:text="Low= " 
        android:textColor="#000000"
        android:textSize = "20sp"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:paddingBottom="5px"
        android:layout_below="@+id/textViewAverage"
        android:layout_centerHorizontal="true" 
    ></TextView>

    <TextView android:id="@+id/textViewMax" 
        android:text="Max= " 
        android:textColor="#000000"
        android:textSize = "20sp"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:paddingBottom="5px"
        android:layout_below="@+id/textViewAverage"
        android:layout_alignParentRight="true"
    ></TextView>

    <TextView android:id="@+id/textViewScore" 
        android:text="Score = " 
        android:textColor="#000000" 
        android:textSize = "30sp"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:paddingBottom="5px"
        android:layout_below="@+id/textViewHi"
        android:layout_alignParentLeft="true"
    ></TextView>

    <TextView android:id="@+id/textViewScoreCalculation" 
        android:text="(score calculation)" 
        android:textColor="#000000"
        android:textSize = "20sp"
        android:textStyle="italic"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:paddingBottom="10px"
        android:layout_below="@+id/textViewScore"
        android:layout_alignParentRight="true"
    ></TextView>

    <TextView android:id="@+id/textViewPoints" 
        android:text="Enter Points: " 
        android:textSize = "30sp"
        android:textColor="#000000"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_below="@+id/textViewScoreCalculation"
        android:layout_alignParentLeft="true"
        android:paddingBottom="10px"
    ></TextView>

    <EditText android:id="@+id/editTextPoints" 
        android:text="" 
        android:digits="-0123456789."
        android:windowSoftInputMode="stateVisible"
        android:focusable="true"
        android:textSize = "30sp"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_alignTop="@+id/textViewPoints" 
        android:layout_alignBottom="@+id/textViewPoints"
        android:layout_toRightOf="@+id/textViewPoints" 
        android:paddingBottom="10px"
    ></EditText>

    <TextView android:id="@+id/textViewBottomMargin" 
        android:text="                              " 
        android:textColor="#FFFFFF"
        android:textSize = "5sp"
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/editTextPoints"
        android:paddingBottom="0px"
    ></TextView>


    </RelativeLayout>


    <include layout="@layout/numerickeyboard" />

</LinearLayout>

我还通过删除android:layout_alignParentBottom="true"语句来修改键盘。

这是一个HVGA_1.6仿真器的屏幕截图(我将你的键盘区域设为绿色,用于截屏)。

enter image description here

根据修正后的问题,“当我们不包括键盘时,也希望statsTopLayout填满屏幕”(见评论),我谦虚地将这些修改提交给原始主键和键盘布局文件:

在原始main.xml中,将根LinearLayout更改为RelativeLayout,然后将<include>移至第一个元素。在该移动的<include>元素中,添加来自android:id="@+id/numberPadLayoutContainer"的{​​{1}}语句(并将其从numerickeyboard.xml中删除(numerickeyboard.xml将在没有本地ID声明的情况下编译)第三个元素现在是封闭的main.xml,现在指定RelativeLayoutlayout_height="fill_parent"

layout_above="@id/numberPadLayoutContainer"

带有<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/statsTabLayout" android:background="#ffffff" android:layout_height="fill_parent" android:layout_width="fill_parent" > <include layout="@layout/numerickeyboard" android:id="@+id/numberPadLayoutContainer" /> <RelativeLayout android:id="@+id/statsTopLayout" android:background="#ffffff" android:layout_height="fill_parent" android:layout_width="wrap_content" android:layout_above="@id/numberPadLayoutContainer"> <TextView android:id="@+id/textViewTopMargin" android:text=" " android:textColor="#FFFFFF" android:textSize = "5sp" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="top" android:layout_alignParentLeft="true" android:paddingTop="0px" ></TextView> <TextView android:id="@+id/textViewAverage" android:text="Average = (%)" android:textColor="#000000" android:textSize = "25sp" android:layout_height="wrap_content" android:layout_width="wrap_content" android:paddingBottom="5px" android:layout_below="@+id/textViewTopMargin" android:layout_alignParentLeft="true" ></TextView> <Button android:id="@+id/buttonReset" android:text="reset" android:onClick="resetButtonClick" android:textSize = "12sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/textViewAverage" android:layout_alignBottom="@+id/textViewAverage" android:layout_below="@+id/textViewTopMargin" android:layout_alignParentRight="true" ></Button> <TextView android:id="@+id/textViewHi" android:text="High= " android:textColor="#000000" android:textSize = "20sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingBottom="5px" android:layout_below="@+id/textViewAverage" android:layout_alignParentLeft="true" ></TextView> <TextView android:id="@+id/textViewLow" android:text="Low= " android:textColor="#000000" android:textSize = "20sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingBottom="5px" android:layout_below="@+id/textViewAverage" android:layout_centerHorizontal="true" ></TextView> <TextView android:id="@+id/textViewMax" android:text="Max= " android:textColor="#000000" android:textSize = "20sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingBottom="5px" android:layout_below="@+id/textViewAverage" android:layout_alignParentRight="true" ></TextView> <TextView android:id="@+id/textViewScore" android:text="Score = " android:textColor="#000000" android:textSize = "30sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingBottom="5px" android:layout_above="@+id/textViewScoreCalculation" android:layout_alignParentLeft="true" ></TextView> <TextView android:id="@+id/textViewScoreCalculation" android:text="(score calculation)" android:textColor="#000000" android:textSize = "20sp" android:textStyle="italic" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingBottom="10px" android:layout_above="@+id/editTextPoints" android:layout_alignParentRight="true" ></TextView> <TextView android:id="@+id/textViewPoints" android:text="Enter Points: " android:textSize = "30sp" android:textColor="#000000" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/textViewBottomMargin" android:layout_alignParentLeft="true" android:paddingBottom="10px" ></TextView> <EditText android:id="@+id/editTextPoints" android:text="" android:digits="-0123456789." android:windowSoftInputMode="stateVisible" android:focusable="true" android:textSize = "30sp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignTop="@+id/textViewPoints" android:layout_alignBottom="@+id/textViewPoints" android:layout_above="@+id/textViewBottomMargin" android:layout_toRightOf="@+id/textViewPoints" android:paddingBottom="10px" ></EditText> <TextView android:id="@+id/textViewBottomMargin" android:text=" " android:textColor="#FFFFFF" android:textSize = "5sp" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentBottom="true" android:paddingBottom="0px" ></TextView> </RelativeLayout> </RelativeLayout> 声明的屏幕截图:

enter image description here

没有<include>语句且没有<include>语句的屏幕截图:

enter image description here