Autore Topic: ottenere prima riga di una textview  (Letto 624 volte)

Offline djdedo

  • Utente normale
  • ***
  • Post: 209
  • Respect: +15
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
ottenere prima riga di una textview
« il: 22 Marzo 2013, 17:52:56 CET »
0
Ciao ragazzi, ho la necessità di ottenere il testo della prima linea di una textview che si sviluppa su un massimo di 3 righe.
Ho provato del codice che fa quasi quello che deve fare ma diverse volte mi ritorna anche la prima parola della seconda riga oppure mezza parola.
Questo è il layout della textview
Codice (XML): [Seleziona]
<LinearLayout
                    android:id="@+id/linearlayout_swipe_content"
                    android:layout_width="wrap_content"
                    android:orientation="horizontal"
                    android:paddingLeft="10dp"
                    android:paddingRight="10dp"
                    android:layout_height="80dp" >
                   
                    <ImageView
                        android:id="@+id/imageview_list_smspercategoria_item_icona"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:paddingRight="10dip"
                        android:layout_gravity="center"
                        android:src="@drawable/icona_categoria_normale" />
                   
                    <TextView
                                android:id="@+id/textview_list_smspercategoria_item_testo"
                                android:layout_width="0dip"
                                android:layout_height="80dp"
                                android:layout_weight="1"
                                android:lines="3"
                                android:textSize="12sp"
                                android:ellipsize="end"
                                android:gravity="center_vertical" />
                   
                </LinearLayout>

e questo è il codice che utilizzo al momento

Codice (Java): [Seleziona]
smsTextView.setText(sms.getTesto(), BufferType.SPANNABLE);
                        smsTextView.setTypeface(SmsProntiFont.getNormal(getContext()));
                        final Spannable span = (Spannable) smsTextView.getText();
                       
                        OnPreDrawListener FirstRowColorListener = new OnPreDrawListener() {
                               
                                private boolean indexOfBound = true;
                               
                                @Override
                                public boolean onPreDraw() {
                                        if (!sms.isInviato() && !sms.nonPiace()) {
                                                // se l'sms non e' stato inviato e piace setto la prima riga in bold e col colore piu' scuro
                                                if (smsTextView.getLineCount() > 1) {
                                                        smsTextView.setTextColor(0xFFA2A2A2);
                                                        Layout layout = smsTextView.getLayout();
                                                        int end = layout.getLineEnd(0);
                                                        while (indexOfBound)
                                                        try {
                                                                span.setSpan(font_bold_first_row, 0, end, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
                                                                indexOfBound = false;
                                                        } catch (IndexOutOfBoundsException e) {
                                                                end--;
                                                                indexOfBound = true;
                                                        }
                                                } else {
                                                        span.setSpan(font_bold_first_row, 0, sms.getTesto().length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
                                                }
                                        } else {
                                                // altrimenti setto il colore piu' chiaro per renderlo meno leggibile e far concentrare
                                                // l'utente sugli altri sms non ancora inviati
                                                smsTextView.setTextColor(0xFFCCCCCC);
                                        }
                                        return true;
                                }
                        };
                       
                        smsTextView.getViewTreeObserver().addOnPreDrawListener(FirstRowColorListener);

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:ottenere prima riga di una textview
« Risposta #1 il: 23 Marzo 2013, 20:50:38 CET »
0
Probabilmente puoi fare un ciclo di tutti i caratteri fino a quando non c'è il carattere /n che sarebbe il carriage return..

Offline djdedo

  • Utente normale
  • ***
  • Post: 209
  • Respect: +15
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
Re:ottenere prima riga di una textview
« Risposta #2 il: 23 Marzo 2013, 20:52:24 CET »
0
Lo mette in automatico la textview quel carattere? Basta usare il getText?

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:ottenere prima riga di una textview
« Risposta #3 il: 23 Marzo 2013, 20:57:18 CET »
0
Onestamente non so se lo mette in automatico, ma se non conosci quanti caretteri ci possono stare in una riga, allora la prima cosa che mi viene in mente è questo approccio. Si il testo lo puoi prendere con getText e poi verifichi carattere dopo carattere fino a quando non incontri un /n...

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:ottenere prima riga di una textview
« Risposta #4 il: 23 Marzo 2013, 21:49:36 CET »
0
La TextView non aggiunge nessun carattere \n per andare a capo, sarebbe assurdo.
Il ritorno a capo in un testo lungo é dovuto al rendering della view nello spazio.

Edit:
Dopo una breve ricerca ho trovato questo Android TextView and getting line of text - Stack Overflow
dovrebbe fare al caso tuo.
« Ultima modifica: 23 Marzo 2013, 21:54:07 CET da blackgin »
Postate il LogCat LogCat LogCat LogCat LogCat

Offline djdedo

  • Utente normale
  • ***
  • Post: 209
  • Respect: +15
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
Re:ottenere prima riga di una textview
« Risposta #5 il: 24 Marzo 2013, 10:48:23 CET »
0
Ciao blackgin, grazie per la risposta. Allora fondamentalmente io faccio la stessa cosa, anzi è la stessa cosa perchè la fine della riga la prendo così. Ho fatto una prova però, mi sono stampato nel logcat il substring direttamente della getText ed effettivamente è corretta, mi da effettivamente la dimensione della prima linea. Quello che scazza è allora l'applicazione di quello span, infatti si nota nel codice un try catch per l'eccezione indexOutOfBoundsException in quanto alle volte l'applicazione crashava senza mettere quel try catch.
In parole povere devo applicare un colore diverso alla prima linea di una textview e sto avendo questi problemi.

Edit:

ho capito dove sta il problema credo, e dovrebbe essere il font che applico allo span che fa andare a capo la riga che in realtà starebbe nella prima linea. Ho fatto una prova applicando solo il colore ed effettivamente tutto viene visualizzato correttamente. Come posso "prevedere" se la riga andrà a capo o meno prima di applicare lo span?

Post unito: 25 Marzo 2013, 16:46:02 CET
Ragazzi ho quasi risolto la questione utilizzando l'oggetto Paint. Al momento però io misuro la dimensione del testo pre e post cambio font e facendo dei controlli ricavo più o meno "quanta" stringa occupa lo stesso spazio che occupava col col font vecchio. Ma questo è inesatto, dovrei capire invece in base alla dimensione della TextView se quella stringa entra oppure no. Come posso fare?
« Ultima modifica: 25 Marzo 2013, 16:46:02 CET da djdedo, Reason: Merged DoublePost »