Проблемы с размещением относительной компоновки Android

У меня возникли проблемы с созданием относительного макета в XML для элемента списка, который будет использоваться для ряда элементов в ListView. Я пытался часами и рву на себе волосы, пытаясь заставить их выглядеть так, как я хочу, но не могу заставить все отображаться в правильном месте, а не перекрываться или смещаться. Я могу получить первое изображение и следующие два текстовых представления, но не могу получить последнее текстовое представление и изображение.

Я прикрепил изображение в стиле каркаса того, как я пытаюсь его выглядеть, и мне интересно, может ли кто-нибудь мне помочь?

альтернативный текст

  • ImageView справа представляет собой набор значков полной высоты строки с отступами вокруг него?
  • Два TextViews занимают большую часть ширины. В текстовом представлении «Адрес» текст может быть длинным, поэтому его может потребоваться обрезать, если в нем не хватает места, или, в идеале, уменьшить размер шрифта?
  • Следующий TextView будет содержать небольшую строку из 5 символов.
  • Последний элемент ImageView представляет собой небольшую стрелку, означающую, что этот элемент списка доступен для получения дополнительной информации. Он должен быть центрирован, как показано.
  • Я хотел бы, чтобы значок, последнее текстовое представление и последнее изображение всегда находились в одном и том же месте/выравнивании по списку.

Если бы кто-то мог предложить некоторую помощь в этом, я был бы так благодарен.

Ура ребята


person Daniel Bowden    schedule 20.07.2010    source источник


Ответы (2)


Для всех, кто заинтересован, мне удалось заставить это работать. Я знаю, как это мучительно — искать ответ на проблему, которая так и не была решена полностью.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip">
<ImageView
    android:id="@+id/Icon"
    android:layout_margin="5dip"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true" />
<TextView
    android:id="@+id/topLine"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:lines="1"
    android:layout_toRightOf="@+id/Icon"
    android:layout_toLeftOf="@+id/distance"
    android:textColor="@color/blacktext"
    android:textSize="20dip"
    android:text="Name" />
<TextView
    android:id="@+id/bottomLine"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:lines="1"
    android:layout_toRightOf="@+id/Icon"
    android:layout_below="@+id/topLine"
    android:layout_toLeftOf="@+id/distance"
    android:textColor="@color/blacktext"
    android:textSize="15dip"
    android:text="Address" />
<TextView 
    android:id="@+id/distance"
    android:layout_height="wrap_content"
    android:layout_toLeftOf="@+id/arrow"
    android:layout_centerVertical="true"
    android:layout_width="wrap_content"
    android:lines="1"
    android:textColor="@color/blacktext"
    android:textSize="12dip"
    android:text="100m" />
<ImageView 
    android:id="@+id/arrow"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_margin="5dip"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true" 
    android:src="@drawable/redarrow"/>
</RelativeLayout>
person Daniel Bowden    schedule 15.08.2010
comment
Это не идеальный ответ, потому что высота имени и адреса не одинакова (50% каждого из их родителей). - person Wayne; 20.06.2012

Я сделал что-то подобное (кроме изображения слева)

Это может помочь вам:

<?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:gravity="center_vertical"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/TextView01"
        android:id="@+id/LinearLayout01"
        android:gravity="center_vertical"
        android:orientation="horizontal">
        <LinearLayout
            android:layout_width="0dip"
            android:layout_weight="1"
            android:paddingRight="8dip"
            android:layout_height="wrap_content"
            android:id="@+id/LinearLayout01"
            android:orientation="vertical">
            <TextView
                android:text="@string/Birthday"
                android:id="@+id/txtTitlevalue"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:singleLine="true"
                android:ellipsize="end"
                android:layout_weight="1"
                android:textAppearance="?android:attr/textAppearanceLarge"></TextView>
            <TextView
                android:text="1960-01-01"
                android:id="@+id/txtSubvalue"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="-4dip"
                android:singleLine="true"
                android:ellipsize="end"
                android:layout_weight="10"
                android:textAppearance="?android:attr/textAppearanceSmall"></TextView>
        </LinearLayout>
        <TextView
            android:text="2"
            android:id="@+id/txtNumber"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textStyle="bold"
            android:layout_marginRight="10dip"
            android:layout_gravity="center_vertical|right"></TextView>
        <TextView
            android:text="weeks"
            android:id="@+id/txtUnit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dip"
            android:layout_gravity="center_vertical|right"></TextView>
    </LinearLayout>
    <!-- <View
        android:background="@drawable/black_white_gradient"
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:layout_marginTop="2dip"
        android:layout_marginBottom="2dip"
        android:clickable="true"
        android:focusable="true"
        android:layout_below="@+id/LinearLayout01" /> -->
</LinearLayout>
person Pentium10    schedule 20.07.2010
comment
Спасибо, возможно, мне придется прибегнуть к LinearLayout, если я не смогу заставить это работать. Однако я читал, что использование LinearLayout для строк элементов списка и, следовательно, его репликация для каждой строки создает много ненужных накладных расходов, тогда как RelativeLayout этого не делает. Вставлю ссылку еще раз, если найду. Но спасибо за ответ, может быть, это то, что мне нужно. - person Daniel Bowden; 20.07.2010
comment
Я нашел ссылку: curious-creature.org/ 2009/02/22/android-layout-tricks-1 И комментарий: этот макет работает, но может быть расточительным, если вы создаете его экземпляр для каждого элемента списка ListView. Один и тот же макет можно переписать с помощью одного RelativeLayout, сохраняя таким образом одно представление, а еще лучше — один уровень в иерархии представлений для каждого элемента списка. - person Daniel Bowden; 21.07.2010