2012-05-14 19 views
11

Puedo usar Spannable en TextViews para crear tramos con diferentes apariencias, subrayados, tachaduras y demás. ¿Cómo puedo hacer lo mismo para alterar el comportamiento del ajuste de línea? En particular, no quiero que una dirección de correo electrónico se envuelva en el medio, quiero que actúe como una palabra.Modificación del comportamiento de alineación de línea

Intenté WrapTogetherSpan, pero no pude hacerlo funcionar. Parece que solo lo usa DynamicLayout, y no pude forzar que TextView utilizara 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" 
    /> 

Cómo estoy estableciendo el 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) 

Respuesta

0

Ha intentado añadir a su android:singleLine="true" XML?

+0

No, porque quiero un máximo de dos líneas. Solo quiero que la dirección de correo electrónico se una como una sola palabra. – pforhan

+0

Disculpas, no entendí eso antes. Tiene mucho más sentido ahora por qué estabas tratando de hacerlo con un spannable. :) – Barak

5

No sé si ha encontrado una respuesta pero puede usar Unicode para ayudarlo.

hay un carácter de espacio no-break, por lo que tendrá que reemplazar todos los espacios que desea ser indisoluble con este carácter (\ u00a0)

para un ejemplo

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

por el he buscado una solución de tramo y no pude encontrar una, WrapTogetherSpan es solo una interfaz por lo que no funcionaría ...

pero con este método estoy seguro de que podría hacer una costumbre irrompible span si wan t.

+0

Bueno, esto funciona para espacios. Pero en el caso de una dirección de correo electrónico como se menciona en la pregunta, no ayuda. Yo * podría * ser capaz de pegar caracteres invisibles como U + FEFF o U + 2060, pero eso es simplemente molesto, ya que tendría que estar entre cada carácter. – pforhan

1

Si está implementando una solución de más bajo nivel (es decir, dibujando su propio texto y manejando el envoltorio de línea usted mismo), entonces vea BreakIterator. El método de fábrica BreakIterator.getLineInstance() trata las direcciones de correo electrónico como una sola unidad.

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; 
} 

El resultado muestra los índices de inicio de límite donde los saltos de línea serían aceptables.

0 My 
3 email 
9 is 
12 [email protected] 

Ver también

Cuestiones relacionadas