2010-08-04 9 views
12

Ho un layout che sembra qualcosa di simile:Come posso determinare quanto testo si adatta a un TextView in Android?

[TextView 1] [TextView 2] 
[ TextView 2 spill-over ] 

In sostanza, ho bisogno i contenuti di TextView 2 per avvolgere alla riga successiva, ma iniziare dove TextView 1 inizia. Stavo pensando che se avessi saputo quanto testo si sarebbe adattato a TextView 2 prima che finisse lo spazio sulla prima riga, avrei potuto prendere il resto del testo e inserirlo in un altro TextView sotto i primi due. Quindi ho bisogno di misurare quanto testo si adatta in un TextView (che può essere difficile perché, per quanto posso dire, Android proverà a rompere il testo in un TextView in una buona posizione in modo che non si romperà una parola in il mezzo se può essere evitato) o ho bisogno di una nuova idea su come spiegarlo.

Qualsiasi aiuto sarebbe molto apprezzato.

Grazie in anticipo,

groomsy

+0

Se questo è possibile, ho la sensazione che sarà molto più complicato che ne varrà la pena. Perché non puoi semplicemente aggiungere il testo di TextView2 a textview 1? – Falmarri

+1

Formattazione diversa. Inoltre, TextView 1 può talvolta essere un ImageView. Ho pensato di mettere tutto in una WebView, ma non so come mi fermerei a 2 linee però. – groomsy

+0

http://stackoverflow.com/questions/7259016/scale-text-in-a-view-to-fit/7259136#7259136 – Ronnie

risposta

9

Sfortunatamente, Paint.breakText non ha restituito lo stesso risultato come è stato visto nel mio TextView a due righe.

Tuttavia, questo ha funzionato

int numChars = textView.getLayout().getLineEnd(1); 

(uso NumberOfLines - 1 come il parametro ad esso)

Rif http://developer.android.com/reference/android/text/Layout.html#getLineEnd(int) Set individual lines of TextView to different width

+0

Questo mi ha fatto andare lungo la strada giusta con un problema correlato. Una combinazione di 'getLineCount' e' getLineStart' ha fatto il trucco per me quando ho personalizzato il taglio/"ellissi" di un TextView. – loeschg

+0

Inoltre, per chiunque abbia un problema con il 'getLayout()' tornare null, controllare questa domanda. http://stackoverflow.com/questions/19157650/how-to-get-height-of-view-inside-adapter-for-creating-sized-bitmap – loeschg

+0

@Ioeschg 'getLayout()' restituisce 'null', ma la il collegamento sopra indicato non è utile. Puoi dire cosa sta andando male? – Ammar

6

È possibile creare un oggetto di pittura con la dimensione del testo di TextView2 e utilizzare breakText() per misurare il numero di caratteri più adatte alla larghezza della TextView2.

(Questo è il codice non testato - potrebbe aver bisogno di alcune lievi modifiche)

String textToBeSplit = arbitraryText; // Text you want to split between TextViews 
float textView2Width = somehowGetItsWidth; // TextView2's width 
float myTextSize = textView2.getTextSize(); 

Paint paint = new Paint(); 
paint.setTextSize(myTextSize); // Your text size 
int numChars = paint.breakText(textToBeSplit, true, float textView2Width, null); 

numChars indica quanti caratteri textToBeSplit si inserisce in larghezza di TextView2, consentendo di dividere tra i vostri punti di vista.

+0

Grazie per il ruvido esempio. Lavorerò su questo e ti faccio sapere come andrà a finire. – groomsy

+0

non funziona per me. Restituisci sempre zero – shantanu

+1

Provato questo e ha quasi funzionato. Il problema era che TextView utilizza un approccio leggermente diverso, specialmente quando ha più di una linea. Il conteggio sarebbe di 2-3 caratteri di. Ho trovato una soluzione migliore che posterò come risposta – dparnas

2

Non hai bisogno di due TextViews al fine di fare questo, si dovrebbe sempre usare il minor numero possibile di visualizzazioni e si può usare una finestra per poter avere due stili per la stessa vista testo.
Ad esempio, con:

TextView tv = (TextView) findViewById(R.id.textview); 
SpannableString text = new SpannableString(myString); 

text.setSpan(new TextAppearanceSpan(getContext(), R.style.myStyle), 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
text.setSpan(new TextAppearanceSpan(getContext(), R.style.myNextStyle), 6, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

tv.setText(text, TextView.BufferType.SPANNABLE); 
Problemi correlati