#android #html #css
#Android #HTML #css
Вопрос:
Это для приложения Android, которое печатает отчеты на ленточном принтере (то есть на узкой бумаге).) Для правильного форматирования отчетов мне нужно сгенерировать таблицу со следующими правилами компоновки:
- Ширина таблицы и ширина каждого столбца являются статическими.
- Левый край каждой ячейки выравнивается по левому краю ее столбца, за исключением того, что:
- Если содержимое ячейки слишком велико, чтобы соответствовать минимальной ширине ячейки, то ячейка занимает всю строку таблицы, а другие ячейки в этой строке перемещаются вниз.
Пример:
Как бы то ни было, я ожидаю, что если такое переполнение произойдет, оно будет либо в столбце 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
из строки и добавляю как дочерний элемент внешнего контейнера, то есть заставляю его занимать всю строку самостоятельно. Я также заполняю ее старое место в исходной строке символом aSpace
, ширина которого равна ширинеTextView
исходного.TextView
Также необходимо изменить размер, чтобы заполнить его строку в контейнере. - Наконец, если какие-либо
TextView
s были перемещены во время этого процесса, я вызываюdraw()
снова, чтобы перестроенная таблица была нарисована на aCanvas
, из которой я могу скопировать растровое изображение.
Я понимаю, что это довольно расплывчато. Если я смогу найти время, чтобы удалить любой проприетарный код из решения, я опубликую его здесь.