【问题标题】:Android - Help needed in solving Layout inconsistancy (RelativeLayout and LinearLayout)Android - 解决布局不一致问题所需的帮助(RelativeLayout 和 LinearLayout)
【发布时间】:2011-08-01 01:50:19
【问题描述】:

我正在使用可重复使用的数字键盘构建应用程序。键盘已放置在其自己的 XML 文件中,因此可以在整个应用程序需要的地方包含它。我想将当前活动的屏幕分成两部分,底部的固定大小的数字键盘和上面的相对布局(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" 
>

有什么建议吗?

【问题讨论】:

    标签: android xml layout android-linearlayout android-relativelayout


    【解决方案1】:

    问题在于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 模拟器的屏幕截图(我将您的键盘区域设置为绿色作为屏幕截图)。

    根据修改后的问题,“也希望 statsTopLayout 在我们不包括键盘的情况下填满屏幕”(见 cmets),我谦虚地将这些修改提交给原来的主和键盘布局文件:

    在原始main.xml 中,将根LinearLayout 更改为RelativeLayout,然后将&lt;include&gt; 移动为其第一个元素。在移动的&lt;include&gt; 元素中,从numerickeyboard.xml 添加android:id="@+id/numberPadLayoutContainer" 语句(并将其从numerickeyboard.xml 中删除(如果没有本地ID 声明main.xml 将无法编译)。第三个元素现在是封闭的@987654339 @,现在指定 layout_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>
    

    &lt;include&gt; 语句的屏幕截图:

    没有&lt;include&gt; 语句和没有android:layout_above="@id/numberPadLayoutContainer" 语句的屏幕截图:

    【讨论】:

    • 这很好,但我不确定它是否是我正在寻找的解决方案。添加了包含顶部控件的相对布局以允许分离。顶部的平均值/高/低/最大值,中间的分数/分数 cal,底部的点输入。这将允许应用程序在更大的手机和平板电脑上使用时自然地调整自身大小。您建议的解决方案会将控件集中在顶部,在较大的手机和标签上留下较大的空白区域。
    • 那么,问题又来了,如何在顶部添加RelativeLayout,在底部添加键盘(也是RelativeLayout),同时让控件像唯一一样放置在屏幕上布局?
    • 我编辑了答案,为您修改后的问题提供解决方案。
    • 就是这样。通过此修复,调整不同手机和标签的屏幕应该只是设置字体大小的问题。谢谢你。我仍然不确定为什么您的解决方案有效,但我的原始解决方案没有;我也不知道为什么首先包括键盘会有所作为。但这些都是另一天的问题......我听到我的床在呼唤。 :-)
    • 哦,谢谢你的详细回答,尤其是屏幕抓取。很多时候,答案很简短、晦涩难懂,而且只有部分例子或没有例子。这对我来说是一个很大的帮助,我相信它会帮助任何在未来遇到这个问题的人。再次感谢。
    【解决方案2】:

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

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

    【讨论】:

    • 我同意,我相当确定键盘正在脱离屏幕。问题是我如何让它停止这样做。如何让 statsTopLayout 发挥出色并与键盘共享物理屏幕。
    • 哦,键盘的 Pt 值无关紧要,因为它会在应用程序运行时动态调整大小。这种动态调整大小是为什么让布局的其余部分表现得很好并充当广告很重要的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多