Tamaño de fuente diferente de cadenas en el mismo TextView


141

Tengo un textViewinterior con un número (variable) y un string, ¿cómo puedo darle al número un tamaño más grande que el string? el código:

TextView size = (TextView)convertView.findViewById(R.id.privarea_list_size);
if (ls.numProducts != null) {
    size.setText(ls.numProducts + " " + mContext.getString(R.string.products));
}

Quiero que ls.numproducts tenga un tamaño diferente al resto del texto. ¿Cómo hacer?

Respuestas:


360

Usar una Spannable String

 String s= "Hello Everyone";
 SpannableString ss1=  new SpannableString(s);
 ss1.setSpan(new RelativeSizeSpan(2f), 0,5, 0); // set size
 ss1.setSpan(new ForegroundColorSpan(Color.RED), 0, 5, 0);// set color
 TextView tv= (TextView) findViewById(R.id.textview);
 tv.setText(ss1); 

Snap shot

ingrese la descripción de la imagen aquí

Puede dividir la cadena usando el espacio y agregar el span a la cadena que necesita.

 String s= "Hello Everyone";  
 String[] each = s.split(" ");

Ahora aplique spanal stringy agregue lo mismo a textview.


setSpan () return: java.lang.IndexOutOfBoundsException: setSpan (0 ... 5) termina más allá de la longitud 1. ¿Qué significa eso?
Adriana Carelli

Verifique la longitud de la cuerda. IndexOutOfBoundsException: indica una posición de índice incorrecta para el inicio y el final del tramo. en la longitud de Hello anterior es 5, así que apliqué el intervalo del índice 0 al 5
Raghunandan

¡Funcionó perfectamente en Google Glass!
Mohammad Arman el

2
¿Hay alguna manera de mover los personajes que son pequeños al centro en dirección vertical? Básicamente, todos los caracteres deben estar centrados verticalmente, independientemente del tamaño.
500865

Probablemente necesite dos vistas de texto en ese caso o de lo contrario deberá crear su propia vista de texto
Raghunandan el

119

En caso de que se pregunte cómo puede configurar varios tamaños diferentes en la misma vista de texto, pero usando un tamaño absoluto y no uno relativo, puede lograrlo usando en AbsoluteSizeSpanlugar de a RelativeSizeSpan.

Simplemente obtenga la dimensión en píxeles del tamaño de texto deseado

int textSize1 = getResources().getDimensionPixelSize(R.dimen.text_size_1);
int textSize2 = getResources().getDimensionPixelSize(R.dimen.text_size_2);

y luego crear uno nuevo AbsoluteSpanbasado en el texto

String text1 = "Hi";
String text2 = "there";

SpannableString span1 = new SpannableString(text1);
span1.setSpan(new AbsoluteSizeSpan(textSize1), 0, text1.length(), SPAN_INCLUSIVE_INCLUSIVE);

SpannableString span2 = new SpannableString(text2);
span2.setSpan(new AbsoluteSizeSpan(textSize2), 0, text2.length(), SPAN_INCLUSIVE_INCLUSIVE);

// let's put both spans together with a separator and all
CharSequence finalText = TextUtils.concat(span1, " ", span2);

Buena adición con AbsoluteSizeSpanejemplo
eugeneek

@AmitGarg, ¿quieres elaborar?
Joao Sousa

44
También puede usar AbsoluteSizeSpan(sizeInDip, true)para especificar el tamaño directamente en dp
Ilia Grabko

8

Puede hacer esto usando una cadena html y configurando el html a Textview usando
txtView.setText(Html.fromHtml("Your html string here"));

Por ejemplo :

txtView.setText(Html.fromHtml("<html><body><font size=5 color=red>Hello </font> World </body><html>"));`

1
Buena contribución! Pero fromHtml de ahora en adelante (API> = N) está en desuso. Para que esto funcione, haga esto para permitir el modo de compatibilidad: if (android.os.Build.VERSION.SDK_INT> = android.os.Build.VERSION_CODES.N) {txtView.setText (Html.fromHtml ("su cadena html")) , Html.FROM_HTML_MODE_LEGACY)); } else {txtView.setText (Html.fromHtml ("su cadena html")); }
statosdotcom 01 de

¿Cuál es la unidad de "5"? ¿Es dp? ¿Es sp? ¿Cómo puedo cambiarlo por alguno de esos?
Desarrollador de Android

5

Método 1

public static void increaseFontSizeForPath(Spannable spannable, String path, float increaseTime) {
    int startIndexOfPath = spannable.toString().indexOf(path);
    spannable.setSpan(new RelativeSizeSpan(increaseTime), startIndexOfPath,
            startIndexOfPath + path.length(), 0);
}

utilizando

Utils.increaseFontSizeForPath(spannable, "big", 3); // make "big" text bigger 3 time than normal text

ingrese la descripción de la imagen aquí

Método 2

public static void setFontSizeForPath(Spannable spannable, String path, int fontSizeInPixel) {
    int startIndexOfPath = spannable.toString().indexOf(path);
    spannable.setSpan(new AbsoluteSizeSpan(fontSizeInPixel), startIndexOfPath,
            startIndexOfPath + path.length(), 0);
}

utilizando

Utils.setFontSizeForPath(spannable, "big", (int) textView.getTextSize() + 20); // make "big" text bigger 20px than normal text

ingrese la descripción de la imagen aquí



3
private SpannableStringBuilder SpannableStringBuilder(final String text, final char afterChar, final float reduceBy) {
        RelativeSizeSpan smallSizeText = new RelativeSizeSpan(reduceBy);
        SpannableStringBuilder ssBuilder = new SpannableStringBuilder(text);
        ssBuilder.setSpan(
                smallSizeText,
                text.indexOf(afterChar),
                text.length(),
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
        );

        return ssBuilder;
    }
------------------------
TextView textView =view.findViewById(R.id.textview);
String s= "123456.24";
textView.setText(SpannableStringBuilder(s, '.', 0.7f));

---------------- Resultado ---------------

Resultado:

12345. 24


2

La mejor manera de hacerlo es HTML sin subcadenas de texto y completamente dinámico. Por ejemplo:

  public static String getTextSize(String text,int size) {
         return "<span style=\"size:"+size+"\" >"+text+"</span>";

    }

y puedes usar el atributo de color, etc. si la otra mano:

size.setText(Html.fromHtml(getTextSize(ls.numProducts,100) + " " + mContext.getString(R.string.products));  

1

He escrito mi propia función que toma 2 cadenas y 1 int (tamaño del texto)

El texto completo y la parte del texto que desea cambiar su tamaño.

Devuelve un SpannableStringBuilder que puede usar en la vista de texto.

  public static SpannableStringBuilder setSectionOfTextSize(String text, String textToChangeSize, int size){

        SpannableStringBuilder builder=new SpannableStringBuilder();

        if(textToChangeSize.length() > 0 && !textToChangeSize.trim().equals("")){

            //for counting start/end indexes
            String testText = text.toLowerCase(Locale.US);
            String testTextToBold = textToChangeSize.toLowerCase(Locale.US);
            int startingIndex = testText.indexOf(testTextToBold);
            int endingIndex = startingIndex + testTextToBold.length();
            //for counting start/end indexes

            if(startingIndex < 0 || endingIndex <0){
                return builder.append(text);
            }
            else if(startingIndex >= 0 && endingIndex >=0){

                builder.append(text);
                builder.setSpan(new AbsoluteSizeSpan(size, true), startingIndex, endingIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }else{
            return builder.append(text);
        }

        return builder;
    }

0

En caso de que desee evitar demasiada confusión para sus traductores, he encontrado una manera de tener solo un marcador de posición en las cadenas, que se manejará en código.

Entonces, supongo que tienes esto en las cadenas:

    <string name="test">
        <![CDATA[
        We found %1$s items]]>
    </string>

Y si desea que el texto del marcador de posición tenga un tamaño y color diferente, puede usar esto:

        val textToPutAsPlaceHolder = "123"
        val formattedStr = getString(R.string.test, "$textToPutAsPlaceHolder<bc/>")
        val placeHolderTextSize = resources.getDimensionPixelSize(R.dimen.some_text_size)
        val placeHolderTextColor = ContextCompat.getColor(this, R.color.design_default_color_primary_dark)
        val textToShow = HtmlCompat.fromHtml(formattedStr, HtmlCompat.FROM_HTML_MODE_LEGACY, null, object : Html.TagHandler {
            var start = 0
            override fun handleTag(opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader) {
                when (tag) {
                    "bc" -> if (!opening) start = output.length - textToPutAsPlaceHolder.length
                    "html" -> if (!opening) {
                        output.setSpan(AbsoluteSizeSpan(placeHolderTextSize), start, start + textToPutAsPlaceHolder.length, 0)
                        output.setSpan(ForegroundColorSpan(placeHolderTextColor), start, start + textToPutAsPlaceHolder.length, 0)
                    }
                }
            }
        })
        textView.text = textToShow

Y el resultado:

ingrese la descripción de la imagen aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.