2010-07-10 2 views
2

Скажем, у меня есть список строк с элементами: «One», «двойки», «Три», «Четыре»Android центрирование текста в списках

Я хочу сосредоточить их в середине экрана, но я хочу сделать это так, чтобы начало каждого слова было рядом друг с другом.

Как это:

         One 
             Two 
             Three 
             Four 

Учитывая, что шрифт, вероятно, имеет различную длину одного символа, как делать это лучше всего в Android?

ответ

1

я не уверен, как приложение ведет себя, и если ListView строго требуется, но эффект вы хотите может быть достигнуто с использованием TableLayout и TableRows. TableLayout будет выстраивать элементы в каждом столбце для каждой строки, как вы описали.

Сказав, что TableLayout не поддерживает линии между строками или сетками (хотя у меня есть некоторые умные хаки, связанные с изменением цвета фона TableRow на черный, а затем изменение цвета прокладки и фона объектов View в TableRow на белый, чтобы получить черную разделительную линию, но это не всегда работает в зависимости от ваших объектов View).

Я нахожусь в подобном рассоле, и это был первый проспект, который я осмотрел. У меня не было решения для моей ситуации, но это может сработать для вас. И если вы найдете способ выстроить текст в Списке, я бы хотел услышать об этом.

EDIT: Я также считаю, что стоит упомянуть (исходя из того, как развивается разговор), что вы также можете установить row.setOnClickListener() и сделать целую строку, кликабельную в TableView. Как только вы завернете его в ScrollView, он будет похож на список.

1

вы можете установить gravity на элементы, которые вы хотите, чтобы быть центром и для detail

android:gravity="center_horizontal" 
+0

Это центрирует элементы независимо друг от друга. Я бы хотел, чтобы их первые буквы были сверху друг друга, как в примере. – Christian

0

Похоже, что вы хотите разместить свои объекты внутри родителя с помощью layout_width="wrap_content" и центрировать весь родитель.

Что-то вроде этого, возможно?

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
    <TextView android:text="Content above..." 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <LinearLayout android:orientation="vertical" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal"> 
     <TextView android:text="One" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
     <TextView android:text="Two" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
     <TextView android:text="Three" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
    </LinearLayout> 

    <TextView android:text="Content below..." 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" />  
</LinearLayout> 

Помните разницу между gravity и layout_gravity. Атрибут gravity относится к содержимому представления. layout_gravity (и все остальные атрибуты с префиксом layout_) относится к макету представления в его родительском элементе.

Edit: Если вы хотите форматировать элементы ListView аналогичным образом, попробовать что-то вроде этого, как ваш элемент списка макет с самого ListView с помощью layout_width="fill_parent" и layout_height="fill_parent":

<LinearLayout android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:minHeight="?android:attr/listPreferredItemHeight" 
    android:weightSum="2" 
    android:gravity="center"> 
    <TextView android:id="@+id/text" 
     android:layout_weight="1" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 
</LinearLayout> 

Изменение содержания в TextView с идентификатором text в каждом элементе списка обычным способом. Настройка minHeight, снятая с текущей темы, гарантирует, что она оставит хороший размер при касании.

Равномерное центрирования в этом случае обрабатывается комбинацией weightSum и gravity на LinearLayout и layout_weight на TextView. Вес TextView, разделенный на weightSum его родителя, определит процент горизонтального пространства, которое LinearLayout даст. В приведенном выше примере он получит 1/2 доступного горизонтального пространства, но центрируется.

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

+0

У этого подхода есть проблема, что все элементы списка не доступны для кликов, однако поверхность с клики должна быть как можно больше. – Christian

+0

А, вам нужны элементы списка ListView, которые можно кликать, а не только другой контент. См. Правки. – adamp

0

Оберните ListView в LinearLayout с layout_gravity = «center_horizontal» или

NVM: что не будет работать, очевидно ..

Так подождите .. Вы хотите получить список, в котором каждая строка является кликабельны для всю ширину экрана, и вы хотите оправдать все строки слева, и ТАКЖЕ сосредоточить весь оправданный текст, не нарушая оправдания?

Смежные вопросы