Android горизонтальный LinearLayout с обернутым текстом в TextView - PullRequest
1 голос
/ 03 августа 2011

Я наблюдал поведение с layout_weight, которое не могу объяснить.Ниже приведен тривиальный пример:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:text="This is a very very very very very very very very very very very very very very very long string." 
        android:layout_weight="1"
    />

    <View
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_gravity="center_vertical"
        android:background="#ffffffff"
    />

</LinearLayout>

На дисплее QVGA TextView переносит текст.Белый квадрат отображается справа от текста.

Однако, если я удалю android: layout_weight = "1" из TextView, TextView теперь займет всю ширину экрана.Белый квадрат больше не отображается.

  1. Почему layout_weight в TextView влияет на отображение белого квадрата или нет?Разве Разве вид с белым фоном не должен всегда назначаться 32dpx32dp первым?(Не имеет значения, были ли представления любого другого типа - ImageView или TextView).
  2. Проблема, над которой я работал, заключается в том, что я хочу, чтобы белый квадрат всегда отображался справа от TextView (независимо от того,не текст обернут), но я не хочу пустого пространства между TextView и белым квадратом.(Если я добавлю android: layout_weight = "1" в TextView, тогда будет пробел, если текст не будет перенесен.)

Любая помощь будет принята!

Ответы [ 3 ]

1 голос
/ 04 августа 2011

Чтобы ответить на мой вопрос № 1: Одна вещь, которую я узнал, посмотрев на источник для LinearLayout : Мало того, что layout_weight назначает неиспользуемое пространство дочернему элементу, он также сокращает дочерний элемент с layout_weight, если дочерний объект расширяется за пределами LinearLayout. Это объясняет, почему TextView с обернутым текстом уменьшен в моем макете.

Что касается ответа на мой вопрос №2, я думаю, что вы имели в виду android: toRigthOf вместо android: layout_alignRight. Использование RelativeLayout вместо LinearLayout не меняет поведение макета. Сложная часть помещает представление непосредственно справа от TextView, без пробелов, независимо от того, переносится текст или нет. Установка maxWidth будет ограничивать ширину TextView, но это решение не масштабируется по горизонтали / горизонтальной ориентации и различным размерам дисплея.

Решение - Похоже, решение Дьяриша - лучшее из доступных. Моя проблема с макетом существует независимо от того, какой макет вы используете. Ключ должен установить maxWidth для TextView, чтобы он не занимал все горизонтальное пространство в макете. Поскольку жесткое кодирование значения android: maxWidth в TextView не масштабируется на разных экранах, установка maxWidth во время выполнения, как предположил Дьяриш, является хорошим решением.

0 голосов
/ 04 августа 2011
  1. Сначала я проверил код из моего другого ответа, и он делает именно то, что вы описали, что вы хотели. (если я не понимаю, что вы просите). Вы определенно не хотите использовать android: layout_alignRight, который не , как в примере кода. Это будет просто держать поле с правой стороны экрана и не повлиять на просмотр текста вообще. В этом примере используется android:layout_toRightOf="@+id/TextForWhiteBox", что возможно из-за относительного расположения. Поскольку относительная компоновка позволяет размещать объекты по отношению к другим. Эта строка всегда помещает прямоугольник справа от текстового представления без пробелов.

  2. Что касается изменения ориентации экрана:

При изменении ориентации создается новый экземпляр вида.

Вот простое решение.

//Add to oncreate in your Activity

     private TextView textStatus;   
     textStatus = (TextView) findViewById(R.id.TextForWhiteBox); 


// This get's the width of your display.
DisplayMetrics displaymetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        int width = displaymetrics.widthPixels;

// Now you know the screen orientation, and it's width. So just set the maxwidth of the text view to match the display width - the pixels of your white box. 

     textStatus.setMaxWidth(width - 32); // 32 is here because you already know the size of the white box. More logic is needed to dynamically get this value, because you would need to wait for the activity to be fully created.
}

Вот main.xml, который я использовал:

<?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="wrap_content"
    android:orientation="horizontal"

>
    <TextView
        android:layout_width="wrap_content"

        android:id="@+id/TextForWhiteBox"
        android:layout_height="wrap_content"
        android:layout_gravity="center|left"
        android:text="This is a very very very very very very very very very very very very very very very very very very very long string."   
    />

    <View android:background="#ffffffff" android:layout_width="32px" android:layout_height="32px" android:id="@+id/view1" android:layout_toRightOf="@+id/TextForWhiteBox"></View>
    </RelativeLayout>

Вам может понадобиться дополнительная логика для сохранения значений на экране.

Этот код был протестирован, вы должны быть в состоянии буквально скопировать и вставить его, чтобы работать так, как вы просили.

Также, в зависимости от вашей логики, вы можете использовать что-то вроде этого, чтобы вернуть ориентацию экрана.

int orient = getResources().getConfiguration().orientation;

Надеюсь, это поможет!

Если это помогло вам, пожалуйста, нажмите кнопку «Принять». =) Ура!

0 голосов
/ 04 августа 2011

Надеюсь, это то, что вы ищете.

Прежде всего, вот отличный ресурс, который я нашел для Создание пользовательского интерфейса .

  1. layout_weight - указывает, сколько дополнительного пространства в макете будет выделено для представления.

  2. Если вы хотите убедиться, что белый квадрат всегда находится справа от текстового представления, вы можете использовать Относительное представление и добавить параметр в представление. Android: layout_alignRight = "+ идентификатор @ yourTextViewID". Это всегда должно приводить к появлению прямоугольника рядом с областью textView. Вероятно, вам также следует добавить что-то вроде android: maxWidth = "250px". Это гарантирует, что вы не вытолкнете белое поле полностью из экрана.

Вот пример кода:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
>

    <TextView
        android:layout_width="wrap_content"
        android:maxWidth="250px"
        android:id="@+id/TextForWhiteBox"
        android:layout_height="wrap_content"
        android:layout_gravity="center|left"
        android:text="This is a very very very very very very very very very very very very very very very long string."   
    />

    <View android:background="#ffffffff" android:layout_width="32dp" android:layout_height="32dp" android:id="@+id/view1" android:layout_toRightOf="@+id/TextForWhiteBox"></View>
    </RelativeLayout>

Вы также можете добавить в представление:

android:layout_alignTop="@+id/TextForWhiteBox" android:layout_alignBottom="@+id/TextForWhiteBox"

, чтобы сделать белый квадрат такого же размера, как TextView.

...