2012-05-31 22 views

Respuesta

54
First Part Not Bold BOLD rest not bold 

Usted puede hacer esto ya sea como @Rajesh sugirió o en el presente.

String normalBefore= "First Part Not Bold "; 
String normalBOLD= "BOLD "; 
String normalAfter= "rest not bold"; 
String finalString= normalBefore+normalBOLD+normalAfter; 
Spannable sb = new SpannableString(finalString); 
sb.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), finalString.indexOf(normalBOLD)+ normalBOLD.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //bold 
sb.setSpan(new AbsoluteSizeSpan(intSize), finalString.indexOf(normalBOLD)+ normalBOLD.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//resize size 

para mostrar esto en TextView

textview.setText(sb); 
+0

¿en qué está configurado el TextEdit? –

+0

También, ¿cómo puedo establecer el tamaño de fuente también para decir el negrita? entonces estoy especificando ambos que es negrita y digo font 20? También –

+6

favor de actualización del índice ser (finalString.indexOf (normalBOLD), finalString.indexOf (normalBOLD) + normalBOLD.lenth()) –

4

código HTML en uso de Vista de Texto utilizando la clase Html:

Spanned styledText = Html.fromHtml("First Part Not Bold <b>BOLD</b> rest not bold"); 
textView.setText(styledText); 
+11

Tenga en cuenta que esto es muy lento y probablemente hará que salten fotogramas si se hace durante el desplazamiento. –

60

La respuesta aceptada está muy bien (y yo upvoted), pero que no hace uso de la SpannableStringBuilder como el remitente solicita. Como tenía un caso en el que el Constructor tenía más sentido, aquí está el código para eso (con un uso adicional de cambiar también el color del texto si eso es útil para otros). Tenga en cuenta que también puede proporcionar la cadena inicial al constructor SpannableStringBuilder, pero la configuré aquí para usar "append" para aclarar que puede agregar mucho antes del texto "en negrita" deseado y luego simplemente registrar el inicio como se muestra. Sospecho que este es también un código más rápido que la respuesta aceptada.

SpannableStringBuilder longDescription = new SpannableStringBuilder(); 
longDescription.append("First Part Not Bold "); 
int start = longDescription.length(); 
longDescription.append("BOLD"); 
longDescription.setSpan(new ForegroundColorSpan(0xFFCC5500), start, longDescription.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
longDescription.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), start, longDescription.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
longDescription.append(" rest not bold"); 
+2

Además, mediante la recuperación de la posición de inicio de la parte en negrita del texto antes de añadir que, usted no tiene que preocuparse de ocurrencias duplicadas de la palabra que se supone ser audaz. – Qw4z1

4

así que sé que esto ha sido resuelto, e incluso a lo solicitado con SpannableStringBuilder pero en el caso de que querían construir una cadena de forma más dinámica que pensé que poner esto.

// Stuff needed 
TextView DataTextView = (TextView)rootView.findViewById(R.id.DataView); 
String Fields[] = {...database column names as strings... "x","y"}; 

String DataString = new String(); 

int start,stop;  // Start and Stop of formatting 

// Final Result 
SpannableStringBuilder coloredString = new SpannableStringBuilder(); 

SpannableString temp;  // Small segment of colored string 
for (int i =0; i < Fields.length; i++) 
{ 
    if (database_result.containsKey(Fields[i])) // Be sure a field exists in the ContentValues 
    { 
      DataString = Fields[i]+": "; 
     start = DataString.length(); 
     DataString = DataString+ +database_result.getAsInteger(Fields[i])+" "; 
     stop= DataString.length(); 
     temp = new SpannableString(DataString); 
     temp.setSpan(new ForegroundColorSpan(Color.WHITE),start, stop, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     coloredString.append(temp); 
    } 
} 
DataTextView.setText(coloredString); 

database_result es un tipo ContentValues ​​que construí a partir del tipo de Cursor devuelto de la consulta SQL. El único problema que tuve con esto fue al principio solo ColorSpaning el primer segmento. Parece que necesitas declarar un nuevo ForegroundColorSpan cada vez que quieras usar uno (o cualquier otro tipo de intervalo) en un bucle.

4

Este código debe establecer en negrita todo lo que entre en la etiqueta html bold. Y también elimina la etiqueta para que solo se muestre el contenido en el interior.

 SpannableStringBuilder sb = new SpannableStringBuilder("this is <b>bold</b> and this is <b>bold too</b> and this is <b>bold too, again</b>."); 

     Pattern p = Pattern.compile("<b>.*?</b>", Pattern.CASE_INSENSITIVE);    
     boolean stop = false; 
     while (!stop) 
     { 
      Matcher m = p.matcher(sb.toString()); 
      if (m.find()) { 
       sb.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
       sb.delete(m.end()-4, m.end()); 
       sb.delete(m.start(), m.start() + 3); 
      } 
      else 
       stop = true; 
     } 

Este código también se puede adaptar para otros etiquetas de estilo HTML, como superíndice (tag sup), etc.

 SpannableStringBuilder sb = new SpannableStringBuilder("text has <sup>superscript</sup> tag"); 

     Pattern p = Pattern.compile("<sup>.*?</sup>", Pattern.CASE_INSENSITIVE);    
     boolean stop = false; 
     while (!stop) 
     { 
      Matcher m = p.matcher(sb.toString()); 
      if (m.find()) { 
       sb.setSpan(new SuperscriptSpan(), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
       sb.delete(m.end()-6, m.end()); 
       sb.delete(m.start(), m.start() + 5); 
      } 
      else 
       stop = true; 
     } 

para establecer el color, sólo tiene que utilizar el ForegroundColorSpan con setSpan.

sb.setSpan(new ForegroundColorSpan(Color.rgb(255, 0, 0)), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); 

Espero que ayude.

23

Desde API 21 SpannableStringBuilder incluye un método simple para hacer esto.Aquí está un ejemplo solución:

SpannableStringBuilder builder= new SpannableStringBuilder(); 
StyleSpan boldSpan = new StyleSpan(android.graphics.Typeface.BOLD); 
builder.append("First Part Not Bold ") 
       .append("BOLD ", boldSpan, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) 
       .append("rest not bold"); 

Dado que es una buena oportunidad que no son compatibles con la API de 21 años sólo se puede duplicar el código de ese método:

public SpannableStringBuilder append(CharSequence text, Object what, int flags) { 
     int start = length(); 
     append(text); 
     setSpan(what, start, length(), flags); 
     return this; 
} 
0

¿para qué usar SpannableStringBuilder cuando pueda usar SpannableBuilder ?? (https://gist.github.com/qtyq/90f9b4894069a8b3676c)

SpannableString ss = SpannableBuilder.init("First Part Not Bold BOLD rest not bold") 
            .makeBold("BOLD") 
            .create() 
+1

porque spannablebuilder construye un palmo, mientras spannablestringbuilder es para la construcción de charsequences con varios períodos diferentes – dabluck

0

También podemos utilizar con SpannableStringBuilderTextAppearanceSpan para lograrlo. Siga los pasos a continuación para implementar de esa manera.

  1. Crea un estilo en styles.xml.

<style name="BoldStyle"> 
 
    <!-- Can add other styling attributes --> 
 
    <item name="android:textStyle">bold</item> 
 
    ...... 
 
</style>

  1. Utilice el código de abajo.
 
SpannableStringBuilder builder = new SpannableStringBuilder("First Part Not Bold BOLD rest not bold"); 
builder.setSpan(new TextAppearanceSpan(this, R.style.BoldStyle), 20, 24, 0); 
((TextView)findViewById(R.id.tv7)).setText(builder); 

Eso es todo. Espero que ayude a alguien.

Cuestiones relacionadas