Установить ширину TextView в символах

88

На самом деле ищу ответ на этот вопрос .

Хотите установить ширину TextView на основе числа или символов. Поэтому, если я хочу, чтобы ширина всегда составляла 3 символа, я мог бы установить это, и он будет регулироваться в зависимости от параметра textSize. Без этого я должен установить ширину 50dip или что-то в этом роде, что может или не может быть правильным в зависимости от размера шрифта.

Fraggle
источник
Возможно, есть способ сделать это, указав свой размер в sp.
CommonsWare
@CommonsWare, да, если вы можете сказать мне, сколько SP равно одному символу, который может работать (но см. Мой ответ ниже с использованием minEms, поскольку я думаю, что это то, что я хочу). Итак, если размер текста = 30sp, и мне нужно 3 символа в ширину, установить ли ширину 90sp? Думаю, я мог бы попробовать.
Fraggle
2
Да, minEmsнаверное, лучший ответ.
CommonsWare

Ответы:

177

Отвечая на свой вопрос ...

И победитель: установите minEmsатрибут ( android:minEms) !!!

Итак, « em », оказывается, относится к размеру самого широкого символа, обычно «M», понятно? Таким образом, установка minEms на целочисленное значение, скажем 3, в EditText или TextView должно обеспечить его ширину не менее 3 символов. Вы также можете установить maxEms.

Итак, ответ Кайла в этой ветке, хотя и неправильный, заставил меня найти ответ, поэтому спасибо Кайлу.

Fraggle
источник
3
конечно, я все еще проверяю, работает ли это на самом деле, но пока похоже, что это так.
Fraggle
8
Также обратите внимание , что layout_widthдолжно быть wrap_contentдля minEms и maxEms к работе по назначению, так как этот ответ указывает.
Jonik
0

Большинство шрифтов не устанавливают одинаковую ширину всех символов. Courier - это, пожалуй, наиболее часто используемое исключение из этого правила, но в целом обратите внимание на разницу между i и A, например. Поэтому то, о чем вы просите, может стать проблемой.

мах
источник
верно, поэтому я надеялся, что эта проблема решена. Поэтому установите ширину в символах, а затем во время отображения узнайте характеристики шрифта для этого поля и определите, насколько большим оно должно быть на основе этого. Так что действительно спрашиваю, была ли решена эта проблема простым приятным способом. Похоже, что нет.
Fraggle
0

Попробуйте использовать: android:maxLength="3"

Это ограничит ваш текст определенным количеством символов.

KyleM
источник
0

ems, вопреки распространенному мнению (или, по крайней мере, из большинства веток об ems здесь), не основывается на ширине одной буквы «М».

Изначально это было так в типографике, но в цифровых носителях, включая Android, его значение было смещено до размера используемого шрифта или, другими словами, его высоты (за исключением любых отступов для акцентов / диакритических знаков).

Это означает, что когда вы указываете emsдля TextView, он будет использовать его textSizeв качестве основы и умножать на emsуказанное.

Например, если вы установите TextView emsдля 16sp равным 4, его ширина будет равна 64sp. Вы можете легко протестировать его, используя два TextView (со includeFontPaddingзначением false) бок о бок внутри ConstraintLayout (чтобы использовать его layout_constraintDimensionRatio).

Андрей Стаков
источник