Un ListView en mi aplicación tiene muchos elementos de la cadena como name, experience, date of joining, etc. Sólo quiero hacer name negrita. Todos los elementos de la cadena será en una sola TextView.

mi XML:

<ImageView
    android:id="@+id/logo"
    android:layout_width="55dp"
    android:layout_height="55dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginTop="15dp" >
</ImageView>

<TextView
    android:id="@+id/label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/logo"
    android:padding="5dp"
    android:textSize="12dp" >
</TextView>

Mi código para establecer el TextView del elemento ListView:

holder.text.setText(name + "\n" + expirience + " " + dateOfJoininf);
InformationsquelleAutor Housefly | 2012-06-11

6 Comentarios

  1. 193

    Dicen que usted tiene un TextView llamado etx. A continuación, utilice el código siguiente:

    final SpannableStringBuilder sb = new SpannableStringBuilder("HELLOO");
    
    final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD); //Span to make text bold
    final StyleSpan iss = new StyleSpan(android.graphics.Typeface.ITALIC); //Span to make text italic
    sb.setSpan(bss, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); //make first 4 characters Bold 
    sb.setSpan(iss, 4, 6, Spannable.SPAN_INCLUSIVE_INCLUSIVE); //make last 2 characters Italic
    
    etx.setText(sb);

    • sí funcionó..gracias
    • en este trabajo con fuentes personalizadas?
    • Funciona con fuentes personalizadas.
    • Para Xamarin, uso como esta var bss = new StyleSpan(Android.Graphics.TypefaceStyle.Bold);
  2. 19

    Basado en Imran Rana de la respuesta, aquí hay un genérico reutilizable método si necesita aplicar StyleSpans a varios TextViews, con soporte para múltiples idiomas (donde los índices son variables):

    void setTextWithSpan(TextView textView, String text, String spanText, StyleSpan style) {
        SpannableStringBuilder sb = new SpannableStringBuilder(text);
        int start = text.indexOf(spanText);
        int end = start + spanText.length();
        sb.setSpan(style, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        textView.setText(sb);
    }

    Usar en una Activity así:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //...
    
        StyleSpan boldStyle = new StyleSpan(Typeface.BOLD);
        setTextWithSpan((TextView) findViewById(R.id.welcome_text),
            getString(R.string.welcome_text),
            getString(R.string.welcome_text_bold),
            boldStyle);
    
        //...
    }

    strings.xml

    <string name="welcome_text">Welcome to CompanyName</string>
    <string name="welcome_text_bold">CompanyName</string>

    Resultado:

    Bienvenido a CompanyName

    • Este es genial!!!
  3. 7

    Las respuestas que se ofrecen aquí son correctos, pero no puede ser llamado en un bucle porque el StyleSpan objeto es una sola contiguos span (no es un estilo que puede ser aplicado a varios grupos). Llamar setSpan varias veces con el mismo negrita StyleSpan crearía una negrita span y sólo se mueven alrededor en el padre span.

    En mi caso (visualización de resultados de búsqueda), que tenía que hacer todas las instancias de todas las palabras clave de búsqueda aparecen en negrita. Esto es lo que hice:

    private static SpannableStringBuilder emboldenKeywords(final String text,
                                                           final String[] searchKeywords) {
        //searching in the lower case text to make sure we catch all cases
        final String loweredMasterText = text.toLowerCase(Locale.ENGLISH);
        final SpannableStringBuilder span = new SpannableStringBuilder(text);
    
        //for each keyword
        for (final String keyword : searchKeywords) {
            //lower the keyword to catch both lower and upper case chars
            final String loweredKeyword = keyword.toLowerCase(Locale.ENGLISH);
    
            //start at the beginning of the master text
            int offset = 0;
            int start;
            final int len = keyword.length(); //let's calculate this outside the 'while'
    
            while ((start = loweredMasterText.indexOf(loweredKeyword, offset)) >= 0) {
                //make it bold
                span.setSpan(new StyleSpan(Typeface.BOLD), start, start+len, SPAN_INCLUSIVE_INCLUSIVE);
                //move your offset pointer 
                offset = start + len;
            }
        }
    
        //put it in your TextView and smoke it!
        return span;
    }

    Tenga en cuenta que el código anterior no es lo suficientemente inteligente como para saltar de doble negrita, si una palabra clave es una subcadena de la otra. Por ejemplo, si usted busca para de Pescado»fi» dentro de «los Peces en el fisty Mar» desarrollará el «pescado» negrita una vez y, a continuación, el «fi» parte. Lo bueno es que mientras ineficiente y un poco indeseable, no va a tener una visual inconveniente ya que su resultado que se muestra aún se observa como

    Peceses en el fiorzuelo Mar

    • Este es el mejor hasta ahora que es genérico y aplicable en todos los casos.
  4. 3

    si usted no sabe exactamente la longitud del texto antes de la parte de texto que desea convertir en Negrita, o incluso usted no sabe la longitud del texto a Negrita, usted puede fácilmente hacer uso de las etiquetas HTML como el siguiente:

    yourTextView.setText(Html.fromHtml("text before " + "<font><b>" + "text to be Bold" + "</b></font>" + " text after"));
  5. 0

    La ampliación de frieder la respuesta de caso de soporte y los signos diacríticos insensibilidad.

    public static String stripDiacritics(String s) {
            s = Normalizer.normalize(s, Normalizer.Form.NFD);
            s = s.replaceAll("[\p{InCombiningDiacriticalMarks}]", "");
            return s;
    }
    
    public static void setTextWithSpan(TextView textView, String text, String spanText, StyleSpan style, boolean caseDiacriticsInsensitive) {
            SpannableStringBuilder sb = new SpannableStringBuilder(text);
            int start;
            if (caseDiacriticsInsensitive) {
                start = stripDiacritics(text).toLowerCase(Locale.US).indexOf(stripDiacritics(spanText).toLowerCase(Locale.US));
            } else {
                start = text.indexOf(spanText);
            }
            int end = start + spanText.length();
            if (start > -1)
                sb.setSpan(style, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
            textView.setText(sb);
        }
  6. -1

    Recomiendo el uso de strings.xml archivo con CDATA

    <string name="mystring"><![CDATA[ <b>Hello</b> <i>World</i> ]]></string>

    A continuación, en el archivo java :

    TextView myTextView = (TextView) this.findViewById(R.id.myTextView);
    myTextView.setText(Html.fromHtml( getResources().getString(R.string.mystring) ));

Dejar respuesta

Please enter your comment!
Please enter your name here