Android TableLayout в ListView, таинственное сокращение столбца - PullRequest
1 голос
/ 07 февраля 2011

Я использую TableLayout в ListView.Данные, которые я представляю, являются табличными по своему характеру, и TableLayout кажется хорошим способом убедиться, что столбцы выстроены по желанию.Этот подход хорошо работал большую часть времени - см. Ниже.

Желаемое представление:
desired view

Но иногда представления, представляющие столбцы, переносят свое текстовое содержимоекак показано ниже.

Поработав некоторое время, я наткнулся на после обсуждения в группе Google Android .В ответ я установил android:stretchColumns="*" в TableLayout и вуаля, содержащиеся TextViews перестали таинственным образом оборачивать свой текст.

Вот частичное содержимое XML макета с изменением, выделенным комментарием:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="horizontal"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:stretchColumns="*">  <!-- stretchColumns needed to prevent
              TableLayout from unilaterally deciding to shrink the column
              width and thereby causing text to wrap. -->

Хотя сейчас я получаю желаемый результат, я немного запутался, почему это «решило» мою проблему.В документации TableLayout указано, что «ширина столбца определяется строкой с самой широкой ячейкой в ​​этом столбце».Но если это правда, почему столбцы, по-видимому, вначале уменьшались в размере, что приводило к переносу текста?

У кого-нибудь есть хорошее объяснение?

1 Ответ

1 голос
/ 09 июня 2011

Контейнеры запрашивают у своих потомков, сколько места им нужно, и этот процесс продолжается рекурсивно. Любой динамически изменяемый размер макета будет работать таким образом. Изнутри дети сообщают своим родителям желаемый размер, а затем на втором проходе родители сообщают своим детям, сколько места им доступно. Когда они не включены в список stretchColumns (либо явно по позиции, либо неявно по шаблону, как в примере), они запрашивают минимальный минимум, который в случае TextView - это минимальное пространство, необходимое для отображения переносимого текста. Когда они включены в список stretchColumns, они сообщают ширину, необходимую для отображения всего содержимого, и, если она подходит, они не переносятся. Любой, кто запрашивает больше места, чем им доступно, получает завернутый текст. Я предполагаю, что приоритет дается по порядку от минимально необходимого места до самого большого, поэтому, если у вас stretchColumns="*", самые большие блоки текста оборачиваются первыми (при необходимости), а все остальные отображаются нормально.

...