L'indice di Android TextView viene tagliato
Domanda
Android TextView ritaglia i miei pedici di testo (vedi immagine sotto) anche quando lo utilizzo android:layout_height="wrap_content"
per TextView.Esiste una soluzione/soluzione alternativa per questo?
P/S:Gli apici funzionano bene
Nota: l'imbottitura non funziona.
- Ho provato anche ad aggiungere un'imbottitura di 50dip ma non è servito a nulla.
- Posso usare un'altezza assoluta come 50dip ma questo incasina tutto quando ho bisogno del testo da avvolgere.
Codice d'esempio:
mtTextView.setText(Html.fromHtml("HC0<sub>3</sub>"));
Soluzione
Questa soluzione ha funzionato per me.
testo in apice di solito è fatta più piccola quando il browser rende, che non sembra accadere qui in modo da poter replicare quel (e risolvere questo problema) in questo modo:
someTextView.setText(Html.fromHtml("Some text<sup><small>1</small></sup>"));
Altri suggerimenti
La maggior parte delle risposte suggeriscono di aggiungere imbottiture o per utilizzare più piccoli sub / apici. Questi potrebbero essere soluzioni alternative riparabili, ma in realtà non risolvere il problema. Idealmente, vogliamo Android per prendere il sub / apice in considerazione nel calcolo altezza della linea. Credo di aver trovato come farlo, e sto condividendo per le persone googling questo problema.
SpannableStringBuilder sb = new SpannableStringBuilder("X2");
sb.setSpan(new SuperscriptSpan(), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(sb, BufferType.SPANNABLE);
Il trucco sta nel BufferType.SPANNABLE. A quanto pare rende TextView prestare maggiore attenzione alla marcatura e calcolare le altezze di linea correttamente.
Per pedice è necessaria una leggera variazione per il suggerimento di cui sopra, due piccoli tag:
textView.setText(Html.fromHtml(
"HCO<sub><small><small>3</small></small></sub>));
Android: lineSpacingExtra = "4DP" dovrebbe risolverlo questo aggiungerà interlinea in eccesso sotto il testo, e mantenere pedice di ottenere cutoff. Non ho provato con apice quindi potrebbe ora sistemare le cose.
Ho avuto lo stesso problema, quindi dopo aver letto i post, ho trovato questo per essere al lavoro.
Esempio: H 2 O
utilizzare semplicemente:
textView.setText(Html.fromHtml("H<sub>2</sub>O"),BufferType.SPANNABLE);
BufferType.SPANNABLE è importante in quanto vi dirà TextView di prendere in considerazione la durata apice.
Se si utilizza tag handler personalizzato per HTML è anche possibile utilizzare in questo modo:
textView.setText(Html.fromHtml(data, null, new CustomHtmlTagHandler(),BufferType.SPANNABLE);
Speranza che aiuta chi cerca stessa problema.
Sono la visualizzazione di frazioni e numeri misti quindi sto utilizzando sia super e l'indicizzazione di insieme. Il Html.fromHtml non ha funzionato per me, sia tagliata la parte superiore o inferiore.
Stranamente, numeri misti funzionava correttamente, ma le frazioni da soli non hanno fatto.
Ho finito per usare uno SpannableString con un SubscriptSpan o un SuperscriptSpan, quindi impostando la dimensione del carattere in un TextAppearanceSpan.
Una volta che avevo fatto che ho dovuto ampliare l'altezza del TextView pure.
TextView number = (TextView)findViewById(R.id.number);
String temp = "1 1/2";
SpannableString s = new SpannableString(temp);
// if the string has a fraction in it, superscript the numerator and subscript the denominator
if (temp.indexOf('/') != -1)
{
int len = temp.length();
s.setSpan(new SuperscriptSpan(), len - 3, len - 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(new TextAppearanceSpan(null, 0, fractionFontSize, null, null), len - 3, len - 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(new TextAppearanceSpan(null, 0, fractionFontSize, null, null), len - 2, len - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(new SubscriptSpan(), len - 1, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(new TextAppearanceSpan(null, 0, fractionFontSize, null, null), len - 1, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
number.setText(s);
Poi ho dovuto ampliare l'altezza:
RelativeLayout.LayoutParams parms = (RelativeLayout.LayoutParams)number.getLayoutParams();
Rect frame = CalcSize(number.getTextSize(), quantityMaxString);
parms.height = frame.height() + fractionAdjustment;
number.setLayoutParams(parms);
calcsize restituisce un rettangolo della grande stringa nella matrice di elementi di visualizzazione.
fractionAdjustment è un valore emperically selezionato che lavora per la dimensione del carattere selezionato regolato per la geometria dello schermo.
. Nota: Questa è TextView è all'interno di un ListView, in modo che possa avere un certo impatto, nonché
// calculate the field dimensions, given the font size and longest string
private static Rect CalcSize(float fontSize, String maxString)
{
Rect bounds = new Rect();
paint.setTypeface(Typeface.DEFAULT);
paint.setTextSize(fontSize);
paint.getTextBounds(maxString, 0, maxString.length(), bounds);
return bounds;
}
I valori empirici:
fractionAdjustment = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 14, resources.getDisplayMetrics());
fractionFontSize = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 11, resources.getDisplayMetrics());
ho affrontato lo stesso problema in ICS e sotto le versioni di Android. Ho risolto il problema con un semplice passo
Dare un'altezza minima al testo View. Si risolverà il problema.
È possibile impostare l'altezza minima tramite XML.
android:minHeight="30dp"
o dinamicamente
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
tv.setMinHeight(52);
}
Questo ha funzionato per me insieme a Piccolo etichetta.
- All'interno del TextView add
android:paddingBottom="1dp"
- Utilizzare il piccolo tag dopo il pedice
yourTextView.setText(Html.fromHtml("" +" Ciao< sub >< small >2< /small > < /sub >"));
Nota Tieni presente che il passaggio 1 è importante, in alcuni casi il mio testo veniva ancora ridotto, utilizzando il riempimentoBottom il problema è stato risolto.Non dimenticare di rimuovere gli spazi nei sub e nei tag piccoli presenti nella mia risposta :)
Il Più il numero di tag in là, il più piccolo è il pedice otterrà e si dovrebbe essere in grado di vedere senza essere ritagliato.
Esempio: H 2 O
Html.fromHtml("H<sub><small><small><small>2</small></small></small></sub>O");