我正在尝试创建一个包含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>
此布局的结果如下所示:
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>
答案 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”。