2012-05-14 21 views
11

Posso usare Spannable in TextViews per creare span con aspetto, sottotitoli, barrato e così via. Come posso fare lo stesso per modificare il comportamento di avvolgimento linea? In particolare, non voglio un indirizzo email per avvolgere nel mezzo, voglio che si comporti come una parola.Modifica del comportamento del ritorno a capo

Ho provato WrapTogetherSpan, ma non riuscivo a farlo funzionare. Sembra che sia utilizzato solo da DynamicLayout e non potrei forzare il TextView a utilizzare DynamicLayout.

<TextView 
    android:id="@+id/merchant_email_field" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="@dimen/account_setting_email" 
    android:gravity="center" 
    android:bufferType="spannable" 
    android:maxLines="2" 
    android:ellipsize="end" 
    /> 

Come sto impostando la spannable:

WrapTogetherSpan TOGETHER_SPAN = new WrapTogetherSpan() {}; 
String collectedString = getString(R.string.email_sentence, userEmail); 
int emailOffset = collectedString.indexOf(userEmail); 
Spannable emailSpannable = Spannable.Factory.getInstance() 
    .newSpannable(collectedString); 
emailSpannable.setSpan(TOGETHER_SPAN, emailOffset, 
    emailOffset + userEmail.length(), 
    Spanned.SPAN_INCLUSIVE_EXCLUSIVE); 
textView.setText(emailSpannable) 

risposta

0

Hai provato aggiungendo android:singleLine="true" al tuo XML?

+0

No, perché voglio fino a due righe. Voglio solo che l'indirizzo e-mail si completi insieme come una parola. – pforhan

+0

Mi scuso, non l'ho capito prima. Ha molto più senso ora perché stavi cercando di farlo con una pubblicità spendibile. :) – Barak

5

Non so se hai trovato una risposta ma puoi usare l'unicode per aiutarti.

c'è un carattere di spazio non-break, quindi sarà necessario sostituire tutti gli spazi che si desidera essere indissolubile con questo personaggio (\ u00A0)

per un esempio

String text = "Hello World"; 
text.replace(' ', '\u00A0'); 
textView.setText(text); 

dal modo in cui ho cercato una soluzione di arco e non poteva trovare uno, WrapTogetherSpan è solo un interfaccia in modo che non avrebbe funzionato ...

ma con questo metodo sono sicuro che si potrebbe fare un indistruttibile personalizzato span se vuoi t.

+0

Bene, questo funziona per gli spazi. Ma nel caso di un indirizzo email come indicato nella domanda, non aiuta. Potrei * essere in grado di attaccare personaggi invisibili come U + FEFF o U + 2060 lì dentro, ma questo è solo fastidioso, dal momento che dovrebbe essere tra ogni caractetr. – pforhan

1

Se si sta implementando una soluzione di livello più basso (ad esempio, disegnando il proprio testo e gestendo il wrapping di linee), vedere BreakIterator. Il metodo di produzione BreakIterator.getLineInstance() considera gli indirizzi di posta elettronica come una singola unità.

String text = "My email is [email protected]"; 
BreakIterator boundary = BreakIterator.getLineInstance(); 
boundary.setText(text); 
int start = boundary.first(); 
for (int end = boundary.next(); end != BreakIterator.DONE; end = boundary.next()) { 
    System.out.println(start + " " + text.substring(start, end)); 
    start = end; 
} 

L'output mostra gli indici iniziali di confine dove le interruzioni di linea sarebbero accettabili.

0 My 
3 email 
9 is 
12 [email protected] 

Vedi anche

Problemi correlati