Android's RelativeLayout seems broken

2020-06-02 10:31发布

问题:

I'm working on a layout where I use a ListView with RelativeLayout line items. The lineitems themselves are not displaying correctly.

The issue is that the txtVideoDuration TextView is drawn at the top of the line item instead of the bottom. Because of this the txtVideoTitle gets a height of 0. As you can see in the XML the txtVideoDuration is supposed to be clamped to the bottom of the ListView.

My goal is to have the layout resemble the tutorial that google gave me. Example: http://android-developers.blogspot.com/2009/02/android-layout-tricks-1.html

I'm using Android 2.0.1. I've even plugged in the example layout with out modification into the ListView and the same behavior happens.

<?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="?android:attr/listPreferredItemHeight"
android:padding="6dip">
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:id="@+id/imgVideoThumbnail"
    android:layout_alignParentTop="true"
    android:layout_alignParentBottom="true"
    android:minHeight="64dip"
    android:layout_marginRight="6dip"
    android:src="@drawable/icon" />
<TextView 
    android:id="@+id/txtVideoDuration"
    android:layout_width="fill_parent"
    android:layout_height="26dip" 
    android:layout_toRightOf="@+id/imgVideoThumbnail"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:text="0:00:00" />
<TextView
    android:id="@+id/txtVideoTitle"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@+id/imgVideoThumbnail"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:layout_above="@+id/txtVideoDuration"
    android:layout_alignWithParentIfMissing="true"
    android:gravity="center_vertical"
    android:text="[Title]"
    android:textColor="#FFFFFF" />

</RelativeLayout>

This simple case works. This is the root XML layout for the activity. The buggy code at the top is the line items in the list view. It seems that the ListView itself is breaking it.

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

<ListView
    android:id="@+id/listVideoCatalog"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />
<TextView
    android:id="@+id/txtName"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:text="Hello World" />
</RelativeLayout>
</merge>

This is the getView Code that inflates the line item into the ListView.

    static class ViewHolder
{
    TextView txtTitle;
    ImageView imgThumbnail;
    TextView txtDuration;
    Uri videoLocation;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    ViewHolder holder;

    if(convertView == null)
    {
        LayoutInflater li = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = li.inflate(R.layout.listitem_videolineitem, null);
        holder = new ViewHolder();
        holder.txtDuration = (TextView) convertView.findViewById(R.id.txtVideoDuration);
        holder.txtTitle = (TextView) convertView.findViewById(R.id.txtVideoTitle);
        holder.imgThumbnail = (ImageView) convertView.findViewById(R.id.imgVideoThumbnail);
        convertView.setTag(holder);
    }
    else
    {
        holder = (ViewHolder) convertView.getTag();
    }

    VideoFile video = this.videos.get(position);
    holder.txtDuration.setText(millisToTimestamp(video.videoDuration));
    holder.txtTitle.setText(video.videoTitle);

            // Some debugger visual code.
    holder.txtDuration.setBackgroundColor(Color.GREEN);
    holder.txtTitle.setBackgroundColor(Color.CYAN);


    return convertView;
}

回答1:

How are you inflating your row views that are "buggy"? Can you provide a code snippet?

Also, android:orientation="vertical" is not valid for RelativeLayout.



回答2:

This was answered in the comment of the accepted answer. Just to make it clear, this is the answer:

Change

li.inflate(R.layout.listitem_videolineitem, null);

to

li.inflate(R.layout.listitem_videolineitem, parent, false);