Aynı TextView içindeki dizelerin farklı yazı tipi boyutu


141

Ben textViewbir sayı (değişken) ile iç ve bir string, nasıl bir numara daha büyük bir boyut verebilirim string? kod:

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

Ls.numproducts metnin geri kalanından farklı bir boyuta sahip olmasını istiyorum. Nasıl yapılır?

Yanıtlar:


360

Kullanın 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); 

Enstantane fotoğraf

resim açıklamasını buraya girin

Boşluğu kullanarak dizeyi bölebilir ve istediğiniz dizeye span ekleyebilirsiniz.

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

Şimdi uygulamak spaniçin stringve aynı ekleyin textview.


setSpan () return: java.lang.IndexOutOfBoundsException: setSpan (0 ... 5) uzunluk 1'in ötesinde biter. Bu ne anlama geliyor?
Adriana Carelli

ipin uzunluğunu kontrol edin. IndexOutOfBoundsException: yayılma alanının başlangıcı ve bitişi için yanlış dizin konumunu gösterir. Yukarıdaki Merhaba uzunluğu 5 yani 0 - 5 endeksinden yayılma uygulanan
Raghunandan

Google Glass üzerinde mükemmel çalıştı!
Mohammad Arman

2
küçük karakterleri ortaya dikey yönde hareket ettirmenin bir yolu var mı? Temelde boyuttan bağımsız olarak tüm karakterler dikey olarak ortalanmalıdır.
500865

Muhtemelen bu durumda iki metin görünümüne ihtiyacınız vardır, yoksa kendi metin görünümünüzü oluşturmanız gerekir
Raghunandan

119

Aynı metin görünümünde birden çok farklı boyutu nasıl ayarlayabileceğinizi merak ediyorsanız, ancak göreceli değil, mutlak bir boyut kullanarak, bunu AbsoluteSizeSpana yerine değil elde edebilirsiniz RelativeSizeSpan.

Boyutu istediğiniz metin boyutunun piksel cinsinden almanız yeterlidir

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

ve sonra AbsoluteSpanmetne dayalı yeni bir tane oluşturun

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

AbsoluteSizeSpanÖrnek ile iyi bir ek
eugeneek

@AmitGarg detaylandırmak ister misiniz?
Joao Sousa

4
Ayrıca, AbsoluteSizeSpan(sizeInDip, true)doğrudan dp içinde boyutunu belirtmek için kullanabilirsiniz
Ilia Grabko

8

Bunu html dizesini kullanarak ve html'yi kullanarak Textview olarak ayarlayabilirsiniz.
txtView.setText(Html.fromHtml("Your html string here"));

Örneğin :

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

1
Güzel katkı! Ancak şu andan itibaren fromHtml (API> = N) kullanımdan kaldırıldı. Bunun çalışması için uyumluluk moduna izin vermek için bunu yapın: if (android.os.Build.VERSION.SDK_INT> = android.os.Build.VERSION_CODES.N) {txtView.setText (Html.fromHtml ("html dizeniz")) , Html.FROM_HTML_MODE_LEGACY)); } else {txtView.setText (Html.fromHtml ("html dizeniz")); }
statosdotcom

"5" birimi nedir? Dp mi? Sp mi? Bunlardan herhangi birini nasıl değiştirebilirim?
android geliştirici

renkler ve aile işleri, ancak boyutu çalışmıyor.
c-bir

5

Yöntem 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);
}

kullanma

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

resim açıklamasını buraya girin

Yöntem 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);
}

kullanma

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

resim açıklamasını buraya girin



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

---------------- Sonuç ---------------

Sonuç:

12345. 24


2

Bunu yapmanın en iyi yolu, metninizi alt dizgisiz ve tamamen dinamik olmayan Html'dir Örneğin:

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

    }

ve renk özniteliğini vb. kullanabilirsiniz ... diğer yandan:

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

1

2 dize ve 1 int (metin boyutu) alan kendi fonksiyonumu yazdım

Tam metin ve metnin boyutunu değiştirmek istediğiniz kısmı.

Metin görünümünde kullanabileceğiniz bir SpannableStringBuilder döndürür.

  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

Çevirmenleriniz için çok fazla karışıklıktan kaçınmak istiyorsanız, kodlarda işlenecek dizelerde sadece bir yer tutucusuna sahip olmanın bir yolunu buldum.

Yani, dizelerde bunu varsayalım:

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

Yer tutucu metnin farklı bir boyut ve renge sahip olmasını istiyorsanız, bunu kullanabilirsiniz:

        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

Ve sonuç:

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.