0

我对 ADT 和 Eclipse 中的布局支持感到有些沮丧。又是 Swing 了。基本上我正在尝试实现一个简单的布局,如下所示:RelativeLayout

+----------------+
|                |
| FrameLayout    |
|    ImageView   |
|                |
|                |
|                |
+----------------+
| LinearLayout   |
|    TextView    |
|    Buttons     |
+----------------+

RelativeLayout 和 FrameLayout 与 ImageView 一起用于我编写的一些平移/缩放侦听器支持。

我遇到的问题是无论我尝试什么,LinearLayout(底部控件)都不会在窗口底部显示。我将简单地粘贴下面的内容。请注意,FieldView 是 ImageView 的扩展。图像显示良好,它的 LinearLayout 想要显示在挡路的 FrameLayout 之上。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fieldcontainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false"
    android:orientation="vertical" >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <com.test.FieldView
            android:id="@+id/field"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </FrameLayout>

    <LinearLayout
        android:id="@+id/controls"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/buttonAddNode"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add node" />

        <TextView
            android:id="@+id/textViewNodeInfo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView" />
    </LinearLayout>

</RelativeLayout>

提前感谢您的任何建议。也许我在之前的尝试中误用了 RelativeLayout 参数。

更新 感谢您的快速响应!我无法对下面的代码发表评论,所以这是我尝试过的更新:

<FrameLayout
    ...
    android:layout_above="@+id/controls">

;以前,我在运行时收到以下异常:

Unable to start activity ComponentInfo{com.test.MainActivity}:
    java.lang.ClassCastException: android.widget.LinearLayout

抛出异常的行在我的 MainActivity.OnCreate() 中:

view = (FieldView) findViewById(R.id.field);

看起来添加 layout_below 会导致 ID 不匹配?查找 R.id.field 正在返回错误的 LinearLayout 的 ID,我自然无法转换。

请注意,如果没有 layout_above,这没有任何问题,只是布局损坏。同样,FieldView 只是 ImageView 的扩展。我将我的触摸监听器和其他一些东西存储在那里。

4

3 回答 3

1

您正在使用 RelativeLayout 但没有使用它的任何属性来控制定位。

正如您所拥有的那样,您还不如使用垂直线性布局。您还将 FrameLayout 和 LinearLayout 的高度设置为 match_parent,这意味着您已将布置这些视图组的所有责任移交给父视图 RelativeLayout。

当 Android 布局布局时,它会执行两次自上而下的传递。首先,父母会问孩子们想要多大。它将自己的大小传递给孩子们来执行此操作。因此,您的每个 FrameLayout 和 LinearLayout 都会说它们希望与父级的大小相同。RelativeLayout 没有规则来确定这些控件应该如何相互关联,因此会尽量使每个控件尽可能大,因为它的内容。第二遍是自上而下,当父母告诉每个孩子自己做多大并渲染布局时。

所以,为了解决你的问题,我会使用两种方法之一(还有更多,但对于像这样的简单布局,你不应该需要它们)。

  • 使用 RelativeLayoutlayout_below来强制 LinearLayout 始终位于 FrameLayout 下方,而不管大小或使用任何各种父对齐属性。

  • 要进行更精确的控制,请使用具有布局权重的 LinearLayout 来定位和精确调整每个子项的大小。如果您采用这种方法,请记住将高度设置为 0dip 并使用视图“支柱”进行定位。

我个人的偏好是使用 LL,因为我发现它们坚如磐石并且易于获得精确的布局大小和定位(尽管我有时不得不扩展它们并弄乱它们的 onMeasure() 方法,但这是一个 Android 碎片问题,而不是直接相关)。

android:layout_weight 是什么意思?

于 2012-11-25T20:31:24.033 回答
1

android:layout_alignParentBottom="true"属性添加到LinearLayout布局中。如果你不想在FrameLayoutLinearLayout,那么你的布局应该是这样的:

<RelativeLayout>

    <LinearLayout  android:id="@+id/ll" android:layout_alignParentBottom="true" />
    <FrameLayout android:layout_above="@id/ll" android:layout_alignParentTop="true"/>
</RelativeLayout>
于 2012-11-25T20:25:05.360 回答
1

您只需将其全部包装在相对布局中,然后使用将线性布局锚定到底部。android:layout_alignParentBottom="true"

为了防止控件被上面的东西过度运行,请使用android:layout_above="@id/controls".

像这样:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fieldcontainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false" >
    <!-- Your other stuff -->

    <LinearLayout
        android:id="@+id/controls"
        android:layout_width="match_parent"
        android:layout_height="wrap_contgnt"
        android:orientation="horizontal"
        android:layout_alignParentBottom="true">
    <!-- Your control stuff -->
    </linearlayout>
</relativelayout>

请注意,您必须先定义一个 id ( @+),然后才能简单地引用 ( @)。因此,您可以将控件视图移动到 XML 文件中的任何其他内容之前,或者在首先出现的位置引用中使用“@+”,然后在视图定义中使用 @。

所以你会有android:layout_above="@+id/controls",然后另一行是android:id="@id/controls".

除非您更改它们,否则更改布局不会影响其中的 id。

于 2012-11-25T20:27:56.830 回答