LinearLayout问题

时间:2011-03-20 20:21:17

标签: android layout

我正在尝试创建一个包含LinearLayout等内容的布局。整个屏幕的XML是:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout android:id="@+id/fileSelView"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="fill_parent">

    <Spinner android:id="@+id/dirListSpinner"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true"/>

    <Spinner android:id="@+id/fileTypeSpinner"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"/>

    <EditText android:id="@+id/fileNameTF"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_toRightOf="@+id/fileTypeSpinner"/>

    <LinearLayout android:id="@+id/centerBox"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_below="@+id/dirListSpinner"
            android:layout_above="@+id/fileTypeSpinner"
            android:layout_alignParentLeft="true"
            android:layout_alignParentRight="true">

        <ListView android:id="@+id/dirView" android:background="#f00"
                android:layout_width="fill_parent" android:layout_height="fill_parent"
                android:layout_weight="1"/>

        <RelativeLayout android:id="@+id/buttonBox" android:background="#0f0"
                android:layout_width="wrap_content" android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:layout_weight="0">

            <Button android:id="@+id/upButton"
                    android:text="Up"
                    android:layout_width="wrap_content" android:layout_height="wrap_content"
                    android:layout_alignParentTop="true"
                    android:layout_centerHorizontal="true"/>

            <Button android:id="@+id/mkdirButton"
                    android:text="MkDir"
                    android:layout_width="wrap_content" android:layout_height="wrap_content"
                    android:layout_below="@+id/upButton"
                    android:layout_centerHorizontal="true"/>

            <Button android:id="@+id/okButton"
                    android:text="OK"
                    android:layout_width="wrap_content" android:layout_height="wrap_content"
                    android:layout_below="@+id/mkdirButton"
                    android:layout_centerHorizontal="true"/>

            <Button android:id="@+id/cancelButton"
                    android:text="Cancel"
                    android:layout_width="wrap_content" android:layout_height="wrap_content"
                    android:layout_below="@+id/okButton"
                    android:layout_centerHorizontal="true"/>

        </RelativeLayout>

    </LinearLayout>

</RelativeLayout>

此布局的结果如下所示:

layout problem

LinearLayout本身按照我想要的方式在其父级中布局,但其内容完全错误。它有两个子节点:左边是ListView,右边是RelativeLayout。 ListView应该占用所有可用的高度和尽可能宽的宽度,而RelativeLayout应该尽可能小并且在其父级中垂直居中。相反,尽管ListView具有android:layout_weight =“1”并且RelativeLayout具有android:layout_weight =“0”,但ListView最终变得过于狭窄,并且RelativeLayout增长以填充空间。此外,RelativeLayout与其父级的顶部对齐,尽管有android:gravity =“center_vertical”。 我做错了什么?

<小时/>

更新

好的,我在RelativeLayout上将android:gravity =“center_vertical”改为android:layout_gravity =“center”,现在它根据需要在其父级中垂直居中。

关于布局权重问题,我尝试在ListView上将android:layout_width =“fill_parent”更改为android:layout_width =“0px”,但这不起作用;我得到了与以前相同的结果,ListView方式太窄,RelativeLayout扩展占用了可用空间。

布局现在如下所示:http://thomasokken.com/layout-problem2.png

请注意,RelativeLayout中的按钮未正确水平居中。就好像RelativeLayout最初的尺寸和布局正确一样,然后向后生长,而没有重新布置它的孩子。

我无法使用RelativeLayout父级使ListView正确调整大小。是否可以在响应setAdapter()调用时调整自身大小?我正在使用一个自定义ListAdapter类,其getView()方法返回RelativeLayout对象:

public View getView(int position, View convertView, ViewGroup parent) {
    File item = items[position];
    if (convertView == null) {
        Context context = parent.getContext();
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.file_selection_dialog_row, null);
        ImageView icon = (ImageView) convertView.findViewById(R.id.fdrowimage);
        icon.setImageResource(item.isDirectory() ? R.drawable.folder : R.drawable.document);
    }
    TextView text = (TextView) convertView.findViewById(R.id.fdrowtext);
    text.setText(item.getName());
    return convertView;
}

列表行的布局如下所示:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" android:layout_height="fill_parent">

    <ImageView android:id="@+id/fdrowimage"
            android:layout_height="35dp" android:layout_width="wrap_content"
            android:layout_alignParentLeft="true"
            android:paddingRight="5dp" android:paddingLeft="3dp"/>

    <TextView android:id="@+id/fdrowtext"
            android:layout_width="wrap_content" android:layout_height="35dp"
            android:layout_toRightOf="@+id/fdrowimage"
            android:layout_alignTop="@+id/fdrowimage"
            android:layout_alignBottom="@+id/fdrowimage"
            android:gravity="center_vertical"
            android:textSize="23dp"/>

</RelativeLayout>

1 个答案:

答案 0 :(得分:1)

这里有一些事情发生。

首先关于RelativeLayout的垂直居中。 android:gravity =“center_vertical”表示此视图的 children 应该应用了center_vertical。它确实在起作用。正如您可以通过绿色背景的大小看到的那样,您的RelativeLayout只有适合按钮所需的大小。你有两个解决方案。如果您希望视图的高度保持不变并在其父级内居中,则可以使用android:layout_gravity =“center”。如果希望RelativeLayout填充列,则需要将RelativeLayout的layout_height设置为“fill_parent”。 android:layout_gravity适用于其父级内部的视图本身。 android:gravity适用于视图的子项。

其次是布局权重问题。 LinearLayout将首先布局任何wrap_content项(即,RelativeLayout),然后它将应用layout_weight AND 大小为0的子项。如果您希望layout_weight正常工作,则需要设置ListView的layout_width为“0px”。