Defina a largura de TextView em termos de caracteres

88

Estou realmente procurando uma resposta para isso .

Deseja definir a largura de um TextView com base em um número ou caracteres. Portanto, se eu quiser que sempre tenha 3 caracteres de largura, posso definir isso e ele se ajustará com base na configuração textSize. Sem isso, eu tenho que definir uma largura para 50dip ou algo assim, que pode ou não estar certo dependendo do tamanho da fonte.

Fraggle
fonte
É possível que haja uma maneira de fazer isso especificando sua dimensão em sp.
CommonsWare
@CommonsWare, sim, se você puder me dizer quantos SP equivalem a um caractere, isso pode funcionar (mas veja minha resposta abaixo usando minEms, pois acho que é isso que quero). Portanto, se o tamanho do texto = 30 sp e eu quero 3 caracteres de largura, devo definir a largura como 90 sp? Acho que posso tentar.
Fraggle
2
Sim, minEmsprovavelmente é uma resposta melhor.
CommonsWare

Respostas:

177

Respondendo minha própria pergunta ...

E o vencedor é: definir o minEmsatributo (android:minEms ) !!!

Então, " ems " se refere ao tamanho do caractere mais largo, normalmente um "M", entendeu? Portanto, definir minEms como um valor inteiro, digamos 3, em um EditText ou TextView deve garantir que ele tenha pelo menos 3 caracteres de largura. Você também pode definir maxEms.

Portanto, a resposta de Kyle neste tópico, embora errada, me fez encontrar a resposta, então, obrigado Kyle.

Fraggle
fonte
3
claro que ainda estou testando para ver se isso realmente funciona, mas até agora parece que sim.
Fraggle
8
Observe também que é layout_widthnecessário que wrap_contentminEms e maxEms funcionem conforme o pretendido, como esta resposta indica.
Jonik
0

A maioria das fontes não define todas as larguras de caracteres como idênticas. Courier é talvez a exceção mais usada para isso, mas geralmente olhe para a diferença entre um i e um A, por exemplo. Isso torna o que você está pedindo para fazer um pouco problemático.

mah
fonte
certo, então eu esperava que esse problema tivesse sido resolvido. Portanto, defina a largura em termos de caracteres e, em seguida, no momento da exibição, descubra as características da fonte para esse campo e determine o tamanho dele com base nisso. Então, realmente perguntando se esse problema havia sido resolvido, de uma maneira fácil e agradável. Parece que não.
Fraggle
0

Tente usar: android:maxLength="3"

Isso limitará seu texto a um número específico de caracteres.

KyleM
fonte
0

ems, ao contrário das crenças populares (ou pelo menos da maioria dos tópicos sobre ems aqui), não é baseado na largura de um único 'M'.

Era originalmente assim na tipografia, mas no meio digital, incluindo Android, seu significado foi mudado para o tamanho da fonte usada, ou em outras palavras, sua altura (excluindo qualquer preenchimento para acentos / diacríticos).

Isso significa que quando você especifica o emspara um TextView, ele o usará textSizecomo base e o multiplicará peloems especificado.

Por exemplo, se você definir um TextView de 16 sp emspara 4, sua largura será de 64 sp. Você pode testá-lo facilmente usando dois TextView (com includeFontPaddingdefinido como false) lado a lado dentro de um ConstraintLayout (para alavancar seu layout_constraintDimensionRatio).

Andrei Stakov
fonte