Ustaw szerokość TextView pod względem znaków

88

Naprawdę szukam odpowiedzi na to pytanie .

Chcesz ustawić szerokość TextView na podstawie liczby lub znaków. Więc jeśli chcę, aby zawsze miał 3 znaki szerokości, mogę to ustawić i dostosuje się na podstawie ustawienia textSize. Bez tego muszę ustawić szerokość na 50dip lub coś w tym stylu, co może, ale nie musi, być właściwe w zależności od rozmiaru czcionki.

Fraggle
źródło
Prawdopodobnie jest na to sposób poprzez określenie swojego wymiaru w sp.
CommonsWare
@CommonsWare, tak, jeśli możesz mi powiedzieć, ile SP równa się jednemu znakowi, który może działać (ale zobacz moją odpowiedź poniżej przy użyciu minEms, ponieważ myślę, że tego właśnie chcę). Więc jeśli rozmiar tekstu = 30 sp i chcę mieć 3 znaki szerokości, czy ustawić szerokość na 90 sp? Chyba mógłbym spróbować.
Fraggle
2
Tak, minEmsto prawdopodobnie lepsza odpowiedź.
CommonsWare

Odpowiedzi:

177

Odpowiadając na moje własne pytanie ...

Zwycięzcą jest: ustaw minEms atrybut ( android:minEms) !!!

Więc "Okazuje się, że ems ” odnosi się do rozmiaru najszerszego znaku, zazwyczaj „M”, rozumiesz? Zatem ustawienie minEms na wartość całkowitą, powiedzmy 3, w EditText lub TextView powinno zapewnić, że ma co najmniej 3 znaki szerokości. Możesz również ustawić maxEms.

Tak więc odpowiedź Kyle'a w tym wątku, chociaż błędna, spowodowała, że ​​znalazłem odpowiedź, więc dziękuję Kyle.

Fraggle
źródło
3
oczywiście nadal testuję, aby sprawdzić, czy to faktycznie działa, ale na razie wygląda na to.
Fraggle
8
Należy również pamiętać, że layout_widthmusi być wrap_contentdla minEms i maxEms do pracy zgodnie z przeznaczeniem, jak owa odpowiedź wskazuje.
Jonik
0

Większość czcionek nie ustawia jednakowych szerokości znaków. Courier jest prawdopodobnie najczęściej używanym wyjątkiem od tej reguły, ale ogólnie spójrz na przykład na różnicę między i a A. To sprawia, że ​​to, o co prosisz, stanowi pewien problem.

mah
źródło
racja, więc miałem nadzieję, że ten problem został rozwiązany. Ustaw więc szerokość w postaci znaków, a następnie w czasie wyświetlania znajdź charakterystykę czcionki dla tego pola i na tej podstawie określ, jaka powinna być duża. Więc naprawdę pytam, czy ten problem został rozwiązany, w przyjemny, łatwy sposób. Wygląda na to, że nie.
Fraggle,
0

Spróbuj użyć: android:maxLength="3"

Spowoduje to ograniczenie tekstu do określonej liczby znaków.

KyleM
źródło
0

ems, wbrew powszechnym przekonaniom (a przynajmniej z większości wątków o emach tutaj), nie opiera się na szerokości pojedynczego „M”.

Pierwotnie tak było w typografii, ale w nośniku cyfrowym, w tym na Androidzie, jego znaczenie zostało przesunięte do rozmiaru użytego kroju pisma, czyli innymi słowy, jego wysokości (z wyłączeniem wszelkich dopełnień dla akcentów / znaków diakrytycznych).

Oznacza to, że kiedy określisz emsdla TextView, użyje go textSizejako podstawy i pomnoży go przez emsokreślony.

Na przykład, jeśli ustawisz 16sp TextView emsna 4, jego szerokość będzie wynosić 64 sp. Możesz go łatwo przetestować, używając dwóch TextView (z includeFontPaddingustawieniem na false) obok siebie w ConstraintLayout (aby wykorzystać jego layout_constraintDimensionRatio).

Andrei Stakov
źródło