代码之家  ›  专栏  ›  技术社区  ›  Lior Iluz

Android:XML布局问题

  •  1
  • Lior Iluz  · 技术社区  · 14 年前

    我一直试图创建一个具有页眉、正文(列表)和页脚的RelativeLayout。 我希望页眉位于所有内容之上(与顶部对齐),正文(列表)位于页眉之下(滚动时),页脚(与底部对齐)位于正文之上(列表)-仅当它可见时。

    在外观方面,我做得很好,但很明显,XML布局是导致我在单击列表项时出现问题的原因( see here , and here ).

    这解决了listItems单击问题,但创建了一个新问题-页脚隐藏了最后一个ListView项目,即使向下滚动列表时列表确实位于页眉下。

    我在这里非常绝望:\

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="#ffffff"
        >
        <RelativeLayout
            android:background="@drawable/top_background"
            android:layout_width="fill_parent"
            android:layout_height="50dip"
            android:id="@+id/top_control_bar"
            >
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:text="Droidmarks"
                android:layout_alignParentLeft="true"
                android:layout_toLeftOf="@+id/add_bookmark"
                android:textSize="20dip"
                android:textColor="#a0cb26"
                android:shadowColor="#7a9b1b"
                android:shadowRadius="5"
                android:layout_marginLeft="5dip"
                android:gravity="left|center" />
            <Button
                android:id="@+id/add_bookmark"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right|center"
                android:layout_alignParentRight="true"
                android:text="Add"
            />
        </RelativeLayout>
        <LinearLayout
            android:id="@+id/bottom_control_bar"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:background="@drawable/top_background"
            android:visibility="invisible"
            >
            <Button
                android:id="@+id/test"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right|center"
                android:layout_alignParentRight="true"
                android:text="Add"
            />
        </LinearLayout>
    
        <ListView
            android:id="@android:id/list"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/top_control_bar"
            android:layout_above="@id/bottom_control_bar"
            android:drawSelectorOnTop="false"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:cacheColorHint="#ffffff"
            android:listSelector="@drawable/selected_item"
            />
        <TextView android:id="@android:id/empty" android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="No Bookmarks found. You can add one by clicking the star."
            android:layout_below="@id/top_control_bar" android:layout_above="@id/bottom_control_bar" />
    </RelativeLayout>
    

    这是一个XML,它隐藏了最后一个列表项,但解决了单击问题:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="#ffffff"
        >
        <RelativeLayout
            android:background="@drawable/top_background"
            android:layout_width="fill_parent"
            android:layout_height="50dip"
            android:id="@+id/top_control_bar"
            android:layout_alignParentTop="true"
            >
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:text="Droidmarks"
                android:layout_alignParentLeft="true"
                android:layout_toLeftOf="@+id/add_bookmark"
                android:textSize="20dip"
                android:textColor="#a0cb26"
                android:shadowColor="#7a9b1b"
                android:shadowRadius="5"
                android:layout_marginLeft="5dip"
                android:gravity="left|center" />
            <Button
                android:id="@+id/add_bookmark"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right|center"
                android:layout_alignParentRight="true"
                android:text="Add"
            />
        </RelativeLayout>
    
        <LinearLayout
            android:id="@+id/listArea"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_below="@id/top_control_bar"
            >
            <ListView
                android:id="@android:id/list"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:drawSelectorOnTop="false"
                android:cacheColorHint="#ffffff" />
            <TextView android:id="@android:id/empty" android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="No Bookmarks found. You can add one by clicking the star." />
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/bottom_control_bar"
            android:layout_above="@id/listArea"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:background="@drawable/top_background"
            android:orientation="horizontal"
            android:visibility="visible"
            >
            <Button
            android:id="@+id/test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right|center"
            android:layout_alignParentRight="true"
            android:text="Add"
        />
        </LinearLayout>
    </RelativeLayout>
    

    我很感激你能帮我找到解决这两个问题的办法!

    谢谢您!

    1 回复  |  直到 7 年前
        1
  •  3
  •   Yoni Samlan    14 年前

    我能问一下你为什么要用相对论来描述这个容器吗?这似乎是一个完美的地方,只需使用一个加权中心区域(listview)的线性布局,该区域设置为在wrap_height-set页眉和页脚之后占据所有剩余区域。relativelayout对于简化包含水平和垂直元素的深度嵌套布局非常有用,但是这里的外层无论如何只包含3个垂直元素,所以使用 orientation:vertical 除非我在这里遗漏了什么。

    编辑:简言之,试试这个;这会给你一个固定高度的页眉,一个环绕高度的页脚,以及占据所有剩余空间的中心区域。确保外部布局设置为 fill_parent layout_weight="1" . 我喜欢在使用layout weight时使用“0px”作为基本布局高度,只是为了在我回去以后重新阅读时保持清晰。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:background="#ffffff"
        >
        <RelativeLayout
            android:background="@drawable/top_background"
            android:layout_width="fill_parent"
            android:layout_height="50dip"
            android:id="@+id/top_control_bar"
            > <!-- snip - inner contents unchanged -->
        </RelativeLayout>
    
        <LinearLayout
            android:id="@+id/listArea"
            android:layout_width="fill_parent"
            android:layout_height="0px"
            android:layout_weight="1"
            android:orientation="horizontal"
            ><!-- snip - inner contents unchanged -->
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/bottom_control_bar"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/top_background"
            android:orientation="horizontal"
            android:visibility="visible"
            ><!-- snip - inner contents unchanged -->
        </LinearLayout>
    </LinearLayout>