एक ही TextView में स्ट्रिंग्स के विभिन्न फ़ॉन्ट आकार


141

मेरे पास एक textViewसंख्या (चर) और एक के साथ अंदर है string, मैं संख्या को एक से बड़ा आकार कैसे दे सकता हूं string? कोड:

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

मैं चाहता हूं कि शेष टेक्स्ट से lnnumproducts का आकार अलग हो। कैसे करें?

जवाबों:


360

का उपयोग 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); 

स्नैप शॉट

यहां छवि विवरण दर्ज करें

आप अंतरिक्ष का उपयोग करके स्ट्रिंग को विभाजित कर सकते हैं और उस स्ट्रिंग को जोड़ सकते हैं जिसकी आपको आवश्यकता है।

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

अब इसे लागू spanकरें stringऔर इसमें समान जोड़ें textview


setSpan () वापसी: java.lang.IndexOutOfBoundsException: setSpan (0 ... 5) लंबाई से परे समाप्त होता है 1. इसका क्या मतलब है?
एड्रियाना केरीली

स्ट्रिंग की लंबाई की जाँच करें। IndexOutOfBoundsException: अवधि की शुरुआत और अंत के लिए गलत सूचकांक स्थिति का संकेत। उपर्युक्त नमस्कार लंबाई 5 है इसलिए मैंने सूचकांक 0 से 5 तक का समय लगाया
रघुनंदन ने

Google ग्लास पर पूरी तरह से काम किया!
मोहम्मद अरमान

2
क्या उन पात्रों को स्थानांतरित करने का एक तरीका है जो ऊर्ध्वाधर दिशा में केंद्र से छोटे हैं? मूल रूप से सभी वर्ण आकार की परवाह किए बिना लंबवत केंद्रित होने चाहिए।
500865

आप शायद उस मामले में दो पाठ विचारों की जरूरत है या फिर आप अपने खुद के पाठ को देखने की जरूरत है
रघुनंदन

119

बस अगर आप सोच रहे हैं कि आप एक ही टेक्स्टव्यू में कई अलग-अलग आकार कैसे सेट कर सकते हैं, लेकिन एक पूर्ण आकार और एक रिश्तेदार का उपयोग करके, आप AbsoluteSizeSpanएक के बजाय उस उपयोग को प्राप्त कर सकते हैं RelativeSizeSpan

बस वांछित पाठ आकार के पिक्सेल में आयाम प्राप्त करें

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

और फिर AbsoluteSpanपाठ के आधार पर एक नया बनाएँ

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उदाहरण के साथ अच्छा जोड़
eugeneek

@AmitGarg क्या आप विस्तृत करना चाहते हैं?
जोआओ सूसा

4
आप AbsoluteSizeSpan(sizeInDip, true)आकार को सीधे dp में निर्दिष्ट करने के लिए भी उपयोग कर सकते हैं
Ilia Grabko

8

आप इसे HTML स्ट्रिंग का उपयोग करके और HTML का उपयोग करके टेक्स्टव्यू पर सेट करने के लिए कर सकते हैं
txtView.setText(Html.fromHtml("Your html string here"));

उदाहरण के लिए :

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

1
अच्छा योगदान! लेकिन अब से HHTml (API> = N) को हटा दिया गया है। इसके लिए काम करने के लिए संगतता मोड की अनुमति दें: यदि (android.os.Build.VERSION.SDK_INT> = android.os.Build.VERSION_CODES.N) {txtView.setText (Html.fromHtml ("आपका html स्ट्रिंग")) , Html.FROM_HTML_MODE_LEGACY)); } और {txtView.setText (Html.fromHtml ("your html string")); }
स्टेटोसॉडकॉम

"5" की इकाई क्या है? क्या यह डी.पी. क्या यह सपा है? मैं उनमें से किसी को कैसे बदल सकता हूं?
एंड्रॉयड डेवलपर

रंग और परिवार हालांकि काम करते हैं, आकार काम नहीं करता है।
c-

5

विधि 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);
}

का उपयोग करते हुए

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

यहां छवि विवरण दर्ज करें

विधि 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);
}

का उपयोग करते हुए

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

यहां छवि विवरण दर्ज करें



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

---------------- परिणाम ---------------

परिणाम :

12345. 24


2

सबसे अच्छा तरीका है कि आपके पाठ को प्रतिस्थापित किए बिना Html है और उदाहरण के लिए पूरी तरह से गतिशील:

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

    }

और आप रंग का उपयोग कर सकते हैं आदि ... अगर दूसरे हाथ:

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

1

मैंने अपना स्वयं का कार्य लिखा है जिसमें 2 तार और 1 int (पाठ का आकार) लगता है

पूर्ण पाठ और पाठ का वह भाग जिसे आप इसका आकार बदलना चाहते हैं।

यह एक SpannableStringBuilder देता है जिसे आप पाठ दृश्य में उपयोग कर सकते हैं।

  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

यदि आप अपने अनुवादकों के लिए बहुत अधिक भ्रम से बचना चाहते हैं, तो मैं स्ट्रिंग्स में सिर्फ एक प्लेसहोल्डर रखने का एक तरीका लेकर आया हूं, जिसे कोड में संभाला जाएगा।

तो, माना जाता है कि यह तार में है:

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

और आप चाहते हैं कि प्लेसहोल्डर टेक्स्ट का अलग आकार और रंग हो, आप इसका उपयोग कर सकते हैं:

        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

और परिणाम:

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.