Tamanho de fonte diferente de strings no mesmo TextView

141

Eu tenho um textViewinterior com um número (variável) e a string, como posso dar ao número um tamanho maior que o string? o 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));
}

Quero que ls.numproducts tenha um tamanho diferente do restante do texto. Como fazer?

Adriana Carelli
fonte

Respostas:

360

Use um 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); 

Foto instantânea

insira a descrição da imagem aqui

Você pode dividir a string usando o espaço e adicionar extensão à string necessária.

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

Agora aplique spanao stringe adicione o mesmo a textview.

Raghunandan
fonte
setSpan () retorna: java.lang.IndexOutOfBoundsException: setSpan (0 ... 5) termina além do comprimento 1. O que isso significa?
Adriana Carelli
verifique o comprimento da string. IndexOutOfBoundsException: indicando a posição incorreta do índice para o início e o fim do período. no comprimento acima Olá é 5 então i aplicado intervalo de índice de 0 a 5
Raghunandan
Funcionou perfeitamente no Google Glass!
Mohammad Arman
2
existe uma maneira de mover os caracteres pequenos para o centro na direção vertical? Basicamente, todos os caracteres devem estar centralizados verticalmente, independentemente do tamanho.
500865 23/09/16
Você provavelmente precisará de dois pontos de vista de texto, nesse caso, ou então você precisa fazer o seu próprio ponto de vista de texto
Raghunandan
119

Caso você esteja se perguntando como pode definir vários tamanhos diferentes na mesma visualização de texto, mas usando um tamanho absoluto e não um relativo, você pode conseguir isso usando em AbsoluteSizeSpanvez de a RelativeSizeSpan.

Basta obter a dimensão em pixels do tamanho de texto desejado

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

e crie um novo com AbsoluteSpanbase no 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);
Joao Sousa
fonte
Boa adição com o AbsoluteSizeSpanexemplo
eugeneek 06/06
@AmitGarg você deseja elaborar?
Joao Sousa
4
Você também pode usar AbsoluteSizeSpan(sizeInDip, true)para especificar o tamanho diretamente no dp
Ilia Grabko
8

Você pode fazer isso usando a string html e definindo o html como Textview usando
txtView.setText(Html.fromHtml("Your html string here"));

Por exemplo :

txtView.setText(Html.fromHtml("<html><body><font size=5 color=red>Hello </font> World </body><html>"));`
Remmyabhavan
fonte
1
Boa contribuição! Mas fromHtml de agora em diante (API> = N) está obsoleto. Para que isso funcione, faça isso para permitir o modo de compatibilidade: if (android.os.Build.VERSION.SDK_INT> = android.os.Build.VERSION_CODES.N) {txtView.setText (Html.fromHtml ("sua string html")) , Html.FROM_HTML_MODE_LEGACY)); } else {txtView.setText (Html.fromHtml ("sua string html")); }
statosdotcom
Qual é a unidade de "5"? É dp? É sp? Como posso alterá-lo para qualquer um desses?
desenvolvedor 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);
}

usando

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

insira a descrição da imagem aqui

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

usando

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

insira a descrição da imagem aqui

Phan Van Linh
fonte
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

Anandharaj R
fonte
2

A melhor maneira de fazer isso é Html, sem substring seu texto e totalmente dinâmica. Por exemplo:

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

    }

e você pode usar atributos de cores etc ... se por outro lado:

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

Eu escrevi minha própria função, que tem 2 strings e 1 int (tamanho do texto)

O texto completo e a parte do texto que você deseja alterar o tamanho dele.

Retorna um SpannableStringBuilder que você pode usá-lo na exibição 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;
    }
Ali Asadi
fonte
0

Caso você queira evitar muita confusão para seus tradutores, criei uma maneira de ter apenas um espaço reservado nas strings, que serão tratadas no código.

Então, você deveria ter isso nas strings:

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

E você deseja que o texto do espaço reservado tenha tamanho e cor diferentes, você pode usar o seguinte:

        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

E o resultado:

insira a descrição da imagem aqui

desenvolvedor android
fonte