Проблема заполнения пространства Android-макета - PullRequest
1 голос
/ 09 мая 2011

Мне очень трудно придумать макет, который работает. У меня есть вид, который заполняет ширину экрана. Он содержит три вложенных представления:

  1. Некоторый текст
  2. число в скобках после основного текста
  3. Кнопка

Кнопка выровнена по правому краю, а текстовые элементы выровнены по левому краю один за другим, как показано:

| Some heading text (n)             [button]  |

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

| Some very very long headin... (n) [button]  |

Самое близкое, что у меня есть, которое успешно обрезает основной текст, приводит к тому, что (n) всегда выравнивается по правому краю рядом с кнопкой, даже когда основной текст достаточно короткий, чтобы уместиться. Это не то, что я хочу.

Как бы вы подошли к этому?

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

Ответы [ 3 ]

1 голос
/ 09 мая 2011

Я не верю, что для этого есть xml-макет. Я предполагаю, что вам нужно будет продлить TextView и измерить длину текста внутри onDraw(...), скорректировав текст соответствующим образом с помощью некоторой итерации (то есть, удаляя один символ за раз пока текст не уместится на холсте)

Я только что нашел другой вопрос, который очень похож на ваш: Эллиптизировать только раздел в TextView . Никакого другого ответа, кроме многоточия посередине.


Другие мысли:

Мне интересно, будет ли работать одно текстовое представление с основным текстом ( эллипс влево , wrap_content ) и другое с число в скобках ( wrap_content ), в горизонтальной линейной компоновке . Этот макет будет внутри относительного макета и layout_toLeftOf кнопки, которая будет wrap_content , layout_alignParentRight .

Есть ли смысл? У меня нет Eclipse сейчас, чтобы проверить его самостоятельно. Не уверен, что текстовое представление (n) будет потеряно за кнопкой или нет с длинным текстом.

В качестве альтернативы (и менее интересного) вы можете настроить один относительный макет с двумя текстовыми представлениями все layout_toRightOf и кнопкой, выровненной вправо ( layout_alignParentRight ) и установите максимальное значение для первого текстового представления ( android: maxWidth ). Однако вам потребуется настроить разные макеты для разных экранов.


Пример с фиксированной максимальной шириной, которая будет работать как требуется:

<?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"
    >
    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="click me"
    android:id="@+id/bt1"
    android:layout_alignParentRight="true"
    />    
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="short text"
    android:lines="1"
    android:ellipsize="end"
    android:id="@+id/t1"
    android:layout_alignParentLeft="true"
    />
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="(n)"
    android:lines="1"
    android:id="@+id/n1"
    android:layout_toRightOf="@id/t1"
    />
    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="click me"
    android:id="@+id/bt2"
    android:layout_below="@id/bt1"
    android:layout_alignParentRight="true"
    />    
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="very long text that will not fit in any layout, regardless of the size of the screen"
    android:lines="1"
    android:ellipsize="end"
    android:id="@+id/t2"
    android:layout_below="@id/bt1"
    android:layout_alignParentLeft="true"
    android:maxWidth="220dp"
    />
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="(n)"
    android:lines="1"
    android:id="@+id/n2"
    android:layout_below="@id/bt1"
    android:layout_toRightOf="@id/t2"
    />
</RelativeLayout>
0 голосов
/ 09 мая 2011

Ключом является порядок элементов, так как это порядок их измерения, чтобы ваша кнопка и текст (n) получили достаточно места в общем макете:

<RelativeLayout
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  >

  <Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    />

  <TextView
    android:id="@+id/middle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="left"
    android:layout_toLeftOf="@id/button"
    android:text="(n)"
    />

   <TextView
     android:id="@+id/title"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_toLeftOf="@id/middle"
     android:layout_alignParentLeft="true"
     android:gravity="left"
     android:ellipsize="end"
     android:text="Some really long to text to make this flow over"
     android:lines="1"
     android:maxLines="1"
     />

</RelativeLayout>
0 голосов
/ 09 мая 2011

Попробуйте линейное расположение, установите вес представления текста равным 1 ,, и установите многоточие как TruncateAt.MIDDLE.Проверьте это расположение

<?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="wrap_content">
    <TextView android:id="@+id/text" android:layout_width="0dp"
        android:layout_height="wrap_content" android:lines="1"
        android:ellipsize="middle" android:gravity="left"
        android:layout_weight="1" />
    <Button android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>
...