2012-05-14 8 views
11

Ich kann Spannable in TextViews verwenden, um Spannen mit unterschiedlichen Looks, Unterstreichungen, Durchstreichungen usw. zu erstellen. Wie kann ich das Zeilenumbruchverhalten ändern? Insbesondere möchte ich nicht, dass eine E-Mail-Adresse in der Mitte liegt, ich möchte, dass sie sich wie ein Wort verhält.Ändern der Zeilenumbruchverhalten

Ich versuchte WrapTogetherSpan, aber ich konnte es nicht zum Funktionieren bringen. Es sieht so aus, als ob es nur von DynamicLayout verwendet wird, und ich konnte das TextView nicht zwingen, DynamicLayout zu verwenden.

<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" 
    /> 

Wie ich die Einstellung der 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) 

Antwort

0

Haben Sie versucht android:singleLine="true" zu Ihrem XML hinzufügen?

+0

Nein, weil ich zwei Linien wollen nach oben. Ich möchte nur, dass die E-Mail-Adresse als ein Wort zusammengefügt wird. – pforhan

+0

Entschuldigung, das habe ich vorher nicht verstanden. Es macht jetzt viel mehr Sinn, warum Sie es mit einem spannbaren tun wollten. :) – Barak

5

Ich weiß nicht, ob Sie eine Antwort gefunden haben, aber Sie können Unicode verwenden, um Ihnen zu helfen.

gibt es eine nicht-Pause Leerzeichen, so dass Sie alle Felder aus Sie mit diesem Zeichen (\ u00A0)

für ein Beispiel

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

durch die sein unzerbrechlich wollen ersetzen müssen So habe ich nach einer Span Lösung gesucht und konnte keine finden, WrapTogetherSpan ist nur eine Schnittstelle, so dass es nicht funktionieren würde ...

aber mit dieser Methode bin ich sicher, dass Sie eine benutzerdefinierte unzerstörbar machen können Spannweite, wenn du wanst t.

+0

Nun, das funktioniert für Räume. Aber im Fall einer E-Mail-Adresse, wie in der Frage erwähnt, hilft es nicht. Ich * könnte * in der Lage sein, unsichtbare Zeichen wie U + FEFF oder U + 2060 darin zu stecken, aber das ist nur ärgerlich, da es zwischen jedem Charakter sein müsste. – pforhan

1

Wenn Sie eine Lösung auf niedrigerer Ebene implementieren (dh Ihren eigenen Text zeichnen und Zeilenumbrüche verarbeiten), dann lesen Sie BreakIterator. Die Factory-Methode BreakIterator.getLineInstance() behandelt E-Mail-Adressen als eine einzelne Einheit.

Die Ausgabe zeigt die Boundary-Startindizes, bei denen Zeilenumbrüche zulässig wären.

0 My 
3 email 
9 is 
12 [email protected] 

Siehe auch