android - TextView BOLD पर एक विशिष्ट पाठ कैसे बनाएं




android-textview android-textattributes (10)

मैंने टेक्स्टव्यू और एडिटटेक्स्ट के लिए टेक्स्ट बोल्ड के हिस्से को सेट करने के लिए एक स्थिर विधि बनाई है

public static void boldPartOfText(View mView, String contentData, int startIndex, int endIndex){
        if(!contentData.isEmpty() && contentData.length() > endIndex) {
            final SpannableStringBuilder sb = new SpannableStringBuilder(contentData);

            final StyleSpan bss = new StyleSpan(Typeface.BOLD); // Span to make text bold
            final StyleSpan iss = new StyleSpan(Typeface.NORMAL); //Span to make text normal
            sb.setSpan(iss, 0, startIndex, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
            sb.setSpan(bss, startIndex, endIndex, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold
            sb.setSpan(iss,endIndex, contentData.length()-1, Spanned.SPAN_INCLUSIVE_INCLUSIVE);

            if(mView instanceof TextView)
               ((TextView) mView).setText(sb);
            else if(mView instanceof EditText)
               ((EditText) mView).setText(sb);

        }
    }

एक और अधिक अनुकूलित कोड

  /*typeFaceStyle can be passed as 

    Typeface.NORMAL = 0;
    Typeface.BOLD = 1;
    Typeface.ITALIC = 2;
    Typeface.BOLD_ITALIC = 3;*/

    public static void boldPartOfText(View mView, String contentData, int startIndex, int endIndex,int typeFaceStyle){
        if(!contentData.isEmpty() && contentData.length() > endIndex) {
            final SpannableStringBuilder sb = new SpannableStringBuilder(contentData);

            final StyleSpan bss = new StyleSpan(typeFaceStyle); // Span to make text bold
            final StyleSpan iss = new StyleSpan(Typeface.NORMAL); //Span to make text italic
            sb.setSpan(iss, 0, startIndex, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
            sb.setSpan(bss, startIndex, endIndex, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold
            sb.setSpan(iss,endIndex,contentData.length()-1,Spanned.SPAN_INCLUSIVE_INCLUSIVE);

            if(mView instanceof TextView)
                ((TextView) mView).setText(sb);
            else if(mView instanceof EditText)
                ((EditText) mView).setText(sb);
        }
    }

मुझे नहीं पता कि TextView पर एक विशिष्ट पाठ कैसे बनाया जाए बोल्ड बनें।

ऐसी बात हे

txtResult.setText(id+" "+name);

मैं आउटपुट इस तरह होना चाहता हूँ:

1111 नील

id और name वेरिएबल हैं जिन्हें मैंने डेटाबेस से मूल्य पुनर्प्राप्त कर लिया है, और मैं id को बोल्ड करना चाहता हूं, लेकिन केवल id इसलिए name प्रभावित नहीं होगा, मुझे नहीं पता कि यह कैसे करें।


@ Mladj0ni के उत्तर के आधार पर, मुझे नीचे दिए गए कोड को काम करने के लिए मिला। समस्या यह थी कि यदि आप String.format का उपयोग करते हैं, तो यह HTML मार्कअप को स्ट्रिप्स करता है, इसलिए आपको स्ट्रिंग्स.एक्सएमएल में ब्रैकेट प्रतीकों से बचना होगा:

strings.xml:

<string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string>

code.java:

String unspanned = String.format(Locale.US, "%s%s", getResources().getString(R.string. welcome_messages), 99);

Spanned spanned;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
    spanned = Html.fromHtml(unspanned, Html.FROM_HTML_MODE_LEGACY);
} else {
    spanned = Html.fromHtml(unspanned);
}

textView.setText(spanned);

यह SpannableStringBuilder से आसान है। प्रदर्शन के लिए, यदि आप केवल एक स्ट्रिंग प्रदर्शित कर रहे हैं, तो उपयोगकर्ता इसे पार्स करने के लिए अतिरिक्त मिलीसेकंड नहीं देखेगा।

here प्रलेखन देखें।


इसका सरल बस इस तरह के निर्दिष्ट पाठ को बंद करें उदाहरण के लिए <b>"your text here:"</b>

<string name="headquarters">"<b>"Headquarters:"</b>" Mooresville, North Carolina, U.S.</string>

नतीजा: मुख्यालय: मूरसविले, उत्तरी कैरोलिना, अमेरिका


चार सूची / पुनर्चक्रण की तरह खोज करते समय स्ट्रिंग स्पैन करने योग्य पहले अक्षर बनाएं

आर वी और अजय

पहले इस तरह हाइलाइटिंग लेकिन मैं नीचे की तरह बनना चाहता था

रवि एन अजय या रवि और एक जय

इसके लिए मैंने शब्द की लंबाई की खोज की है यदि यह 1 के बराबर है, तो मैंने मुख्य स्ट्रिंग को शब्दों और गणना की गई शब्द की स्थिति में विभाजित किया, फिर मैंने चार से शुरू होने वाले शब्द की खोज की।

 public static SpannableString colorString(int color, String text, String... wordsToColor) {
    SpannableString coloredString = new SpannableString(text);

    for (String word : wordsToColor) {

        Log.e("tokentoken", "-wrd len-" + word.length());
        if (word.length() !=1) {
            int startColorIndex = text.toLowerCase().indexOf(word.toLowerCase());
            int endColorIndex = startColorIndex + word.length();
            try {
                coloredString.setSpan(new ForegroundColorSpan(color), startColorIndex, endColorIndex,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            } catch (Exception e) {
                e.getMessage();
            }
        } else {
            int start = 0;

            for (String token : text.split("[\u00A0 \n]")) {
                if (token.length() > 0) {
                    start = text.indexOf(token, start);
                   // Log.e("tokentoken", "-token-" + token + "   --start--" + start);
                    char x = token.toLowerCase().charAt(0);
                    char w = word.toLowerCase().charAt(0);
                   // Log.e("tokentoken", "-w-" + w + "   --x--" + x);

                    if (x == w) {
                        // int startColorIndex = text.toLowerCase().indexOf(word.toLowerCase());
                        int endColorIndex = start + word.length();
                        try {
                            coloredString.setSpan(new ForegroundColorSpan(color), start, endColorIndex,
                                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

                        } catch (Exception e) {
                            e.getMessage();
                        }
                    }
                }
            }

        }

    }

    return coloredString;
}

जैसा कि wtsang02 ने कहा, HTML का उपयोग करना एक महंगा ओवरहेड है। बस मूल समाधान का उपयोग करें। यदि आपको स्ट्रिंग को संशोधित करने की आवश्यकता नहीं है, तो केवल स्पैन करने योग्य स्ट्रिंग का उपयोग करें, स्पैन करने योग्य स्ट्रिंगबिल्डर नहीं।

String boldText = "id";
String normalText = "name";
SpannableString str = new SpannableString(boldText + normalText);
str.setSpan(new StyleSpan(Typeface.BOLD), 0, boldText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(str);

बस HTML में अपना स्ट्रिंग बनाएं और इसे सेट करें:

String sourceString = "<b>" + id + "</b> " + name; 
mytextview.setText(Html.fromHtml(sourceString));

मैंने सोचा कि चुने गए उत्तर ने संतोषजनक परिणाम नहीं दिया है। मैंने अपना खुद का काम लिखा है जिसमें 2 तार लगते हैं; पूरा पाठ और उस पाठ का हिस्सा जिसे आप बोल्ड बनाना चाहते हैं।

यह बोल्ड किए गए 'टेक्स्ट' से 'टेक्स्ट टॉबल्ड' के साथ एक स्पैन करने योग्य स्ट्रिंगबिल्डर देता है।

मुझे उपयोगी टैग में लपेटे बिना एक सबस्ट्रिंग बोल्ड बनाने की क्षमता मिलती है।

    /**
     * Makes a substring of a string bold.
     * @param text          Full text
     * @param textToBold    Text you want to make bold
     * @return              String with bold substring
     */

    public static SpannableStringBuilder makeSectionOfTextBold(String text, String textToBold){

        SpannableStringBuilder builder=new SpannableStringBuilder();

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

            //for counting start/end indexes
            String testText = text.toLowerCase(Locale.US);
            String testTextToBold = textToBold.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 StyleSpan(Typeface.BOLD), startingIndex, endingIndex, 0);
            }
        }else{
            return builder.append(text);
        }

        return builder;
  }

यदि आप XML से स्ट्रिंग का उपयोग करना चाहते हैं, तो आप ऐसा कुछ कर सकते हैं:

strings.xml

<string name="test">
     <![CDATA[
 <b>bold!</b> normal
    ]]>
</string>

कोड:

textView.setText(Html.fromHtml(getString(R.string.test)));

सबसे पहले: आपको राघव सूद के उत्तर से धीमे प्रदर्शन कोड का उपयोग करने की चिंता करने की आवश्यकता नहीं है।

दूसरा: कोटलिन का उपयोग करते समय आपको w3bshark के उत्तर द्वारा प्रदान किए गए एक एक्सटेंशन फ़ंक्शन को लिखने की आवश्यकता नहीं है।

Finnaly: आपको Google से Kotlin android-ktx लाइब्रेरी का उपयोग करने की ज़रूरत है:

// Suppose id = 1111 and name = neil (just what you want). 
val s = SpannableStringBuilder()
          .bold { append(id) } 
          .append(name)
txtResult.setText(s) 

उत्पादन: 1111 नील


public static Spanned getBoldString(String textNotBoldFirst, String textToBold, String textNotBoldLast) {
    String resultant = null;

    resultant = textNotBoldFirst + " " + "<b>" + textToBold + "</b>" + " " + textNotBoldLast;

    return Html.fromHtml(resultant);

}

इसे इस्तेमाल करे। यह निश्चित रूप से मदद कर सकता है





android-textattributes