Динамическое растягивание ячейки таблицы по строкам в соответствии с ее содержимым

#android #html #css

#Android #HTML #css

Вопрос:

Это для приложения Android, которое печатает отчеты на ленточном принтере (то есть на узкой бумаге).) Для правильного форматирования отчетов мне нужно сгенерировать таблицу со следующими правилами компоновки:

  1. Ширина таблицы и ширина каждого столбца являются статическими.
  2. Левый край каждой ячейки выравнивается по левому краю ее столбца, за исключением того, что:
  3. Если содержимое ячейки слишком велико, чтобы соответствовать минимальной ширине ячейки, то ячейка занимает всю строку таблицы, а другие ячейки в этой строке перемещаются вниз.

Пример:

Таблица, в которой содержимое 2-й строки занимает две строки таблицы. Ячейка B1 занимает целую строку, а ячейки B2 и B3 сдвинуты на одну строку вниз.

Как бы то ни было, я ожидаю, что если такое переполнение произойдет, оно будет либо в столбце 1, либо (что менее вероятно) в последнем столбце.

Решение может использовать HTML CSS в WebView или закадровое дерево представлений Android. В любом случае все, что мне нужно, это получить растровое изображение, которое я могу отправить на принтер. (Я знаю, что могу сделать это с помощью WebView, и я считаю, что могу сделать это и с помощью дерева представлений.) Однако я не верю, что HTML CSS или какие-либо из контейнерных виджетов Android предлагают стратегии компоновки и определения размеров, которые я ищу. Кто-нибудь знает иначе?

Комментарии:

1. css не может этого сделать ни для таблицы, ни для css, если css может позволить элементу расти (flex, inline-block, float, ..), css не может поддерживать выравнивание строк и столбцов на лету. вам придется думать иначе или использовать javascript, чтобы разобраться в этом:( .

2. @G-Cyr: Спасибо; это то, что я подозревал в css. Я даже не уверен, можно ли это сделать с помощью javascript: как я могу определить, что конкретная ячейка в таблице или сетке нуждается в изменении размера? (По общему признанию, мой javascript довольно ржавый, но я осматривался и пока ничего не придумал.)

Ответ №1:

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

Высокоуровневое описание решения:

Я начинаю с внешнего контейнера (скажем, a LinearLayout с ориентацией, установленной на ВЕРТИКАЛЬНУЮ), дочерними элементами которого изначально являются все горизонтальные LinearLayout s, содержащие «ячейки» таблицы, которые изначально являются всеми TextViews .

Я вызываю draw() внешний контейнер. При этом каждая TextView ячейка в таблице располагается в своих позициях по умолчанию (т. Е. Как «ячейки» внутри строки во внешнем контейнере). После этого первоначального макета я делаю следующее:

  • Найдите текстовые представления в каждой из строк контейнера и вызовите getLineCount() каждую из них.
  • Если getLineCount() возвращается значение> 1, то я удаляю его TextView из строки и добавляю как дочерний элемент внешнего контейнера, то есть заставляю его занимать всю строку самостоятельно. Я также заполняю ее старое место в исходной строке символом a Space , ширина которого равна ширине TextView исходного. TextView Также необходимо изменить размер, чтобы заполнить его строку в контейнере.
  • Наконец, если какие-либо TextView s были перемещены во время этого процесса, я вызываю draw() снова, чтобы перестроенная таблица была нарисована на a Canvas , из которой я могу скопировать растровое изображение.

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