android - क्या टेक्स्टव्यू के अंदर कई शैलियों को संभव है?




styles textview (12)

क्या टेक्स्टव्यू के अंदर पाठ के विभिन्न टुकड़ों के लिए कई शैलियों को सेट करना संभव है?

उदाहरण के लिए, मैं पाठ को निम्नानुसार सेट कर रहा हूं:

tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);

क्या प्रत्येक पाठ तत्व के लिए एक अलग शैली हो सकती है? उदाहरण के लिए, लाइन 1 बोल्ड, शब्द 1 इटालिक, इत्यादि।

डेवलपर गाइड के सामान्य कार्य और एंड्रॉइड में उन्हें कैसे करें टेक्स्ट का चयन, हाइलाइटिंग या स्टाइलिंग भाग शामिल हैं :

// Get our EditText object.
EditText vw = (EditText)findViewById(R.id.text);

// Set the EditText's text.
vw.setText("Italic, highlighted, bold.");

// If this were just a TextView, we could do:
// vw.setText("Italic, highlighted, bold.", TextView.BufferType.SPANNABLE);
// to force it to use Spannable storage so styles can be attached.
// Or we could specify that in the XML.

// Get the EditText's internal text storage
Spannable str = vw.getText();

// Create our span sections, and assign a format to each.
str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new BackgroundColorSpan(0xFFFFFF00), 8, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 21, str.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

लेकिन यह पाठ के अंदर स्पष्ट स्थिति संख्या का उपयोग करता है। क्या ऐसा करने का कोई क्लीनर तरीका है?


अगर कोई यह सोच रहा है कि यह कैसे करना है, तो यहां एक तरीका है: (फिर से चिह्नित करने के लिए धन्यवाद!)

mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" +  "<br />" + 
            "<small>" + description + "</small>" + "<br />" + 
            "<small>" + DateAdded + "</small>"));

इस विधि द्वारा समर्थित टैग की अनौपचारिक सूची के लिए, इस लिंक या इस प्रश्न का संदर्भ लें: एंड्रॉइड टेक्स्टव्यू द्वारा कौन से HTML टैग समर्थित हैं?


अब <b> तत्व बहिष्कृत है। <strong> <b> रूप में प्रस्तुत करता है, और <em> <i> रूप में प्रस्तुत करता है।

tv.setText(Html.fromHtml("<strong>bold</strong> and <em>italic</em> "));

यह मेरे लिए ठीक काम करता है


जैसा कि कहा गया है, TextView.setText(Html.fromHtml(String))

और इन टैग्स को अपने एचटीएमएल स्वरूपित स्ट्रिंग में उपयोग करें:

<a href="...">
<b>
<big>
<blockquote>
<br>
<cite>
<dfn>
<div align="...">
<em>
<font size="..." color="..." face="...">
<h1>
<h2>
<h3>
<h4>
<h5>
<h6>
<i>
<img src="...">
<p>
<small>
<strike>
<strong>
<sub>
<sup>
<tt>
<u>

http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html


जैसा कि जॉन gist.github.com/aegis1980/b138dcb2fd1b2e98aa30 , मेरे लिए यह सबसे अच्छा समाधान है और आपको रनटाइम पर कोई भी टेक्स्ट सेट करने की आवश्यकता नहीं है, केवल इस कस्टम क्लास HtmlTextView का उपयोग करें

public class HtmlTextView extends TextView {

  public HtmlTextView(Context context) {
      super(context);
  }

  public HtmlTextView(Context context, AttributeSet attrs) {
      super(context, attrs);
  }

  public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr) 
  {
      super(context, attrs, defStyleAttr);
  }

  @TargetApi(21)
  public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
      super(context, attrs, defStyleAttr, defStyleRes);
  }

  @Override
  public void setText(CharSequence s,BufferType b){
      super.setText(Html.fromHtml(s.toString()),b);
  }

}

और यह है, अब इसे केवल अपने एक्सएमएल में डाल दिया

<com.fitc.views.HtmlTextView
    android:id="@+id/html_TV"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/example_html" />

अपने एचटीएमएल स्ट्रिंग के साथ

<string name="example_html">
<![CDATA[
<b>Author:</b> Mr Donuthead<br/>
<b>Contact:</b> [email protected]<br/>
<i>Donuts for life </i>
]]>


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

मुझे उम्मीद है कि यह दूसरों को एक ही काम करने में मदद करता है - मुझे नहीं पता कि यह ढांचे में क्यों आसान नहीं है।

मेरे तार इस तरह दिखते हैं:


<string name="my_text">{0} You will need a {1} to complete this assembly</string>
<string name="text_sub0">1:</string>
<string name="text_sub1">screwdriver, hammer, and measuring tape</string>

शैलियों यहाँ हैं:


<style name="MainStyle">
    <item name="android:textSize">@dimen/regular_text</item>
    <item name="android:textColor">@color/regular_text</item>
</style>
<style name="style0">
    <item name="android:textSize">@dimen/paragraph_bullet</item>
    <item name="android:textColor">@color/standout_text</item>
    <item name="android:textStyle">bold</item>
</style>
<style name="style1">
    <item name="android:textColor">@color/standout_light_text</item>
    <item name="android:textStyle">italic</item>
</style>

यहां मेरा कोड है जो मेरे प्रारूप को कॉल करता है स्टाइल विधि:


SpannableString formattedSpan = formatStyles(getString(R.string.my_text), getString(R.string.text_sub0), R.style.style0, getString(R.string.main_text_sub1), R.style.style1);
textView.setText(formattedSpan, TextView.BufferType.SPANNABLE);

प्रारूप विधि:


private SpannableString formatStyles(String value, String sub0, int style0, String sub1, int style1)
{
    String tag0 = "{0}";
    int startLocation0 = value.indexOf(tag0);
    value = value.replace(tag0, sub0);

    String tag1 = "{1}";
    int startLocation1 = value.indexOf(tag1);
    if (sub1 != null && !sub1.equals(""))
    {
        value = value.replace(tag1, sub1);
    }

    SpannableString styledText = new SpannableString(value);
    styledText.setSpan(new TextAppearanceSpan(getActivity(), style0), startLocation0, startLocation0 + sub0.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    if (sub1 != null && !sub1.equals(""))
    {
        styledText.setSpan(new TextAppearanceSpan(getActivity(), style1), startLocation1, startLocation1 + sub1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }

    return styledText;
}

यदि आप एक्सएमएल में स्टाइल टेक्स्ट जोड़ने में सक्षम होना चाहते हैं तो आप टेक्स्ट व्यू को विस्तारित करने और सेटटेक्स्ट () को ओवरराइड करने के लिए कस्टम व्यू बना सकते हैं:

public class HTMLStyledTextView extends TextView
{
    public HTMLStyledTextView(Context context) {
        super(context);
    }

    public HTMLStyledTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public HTMLStyledTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setText(CharSequence text, BufferType type)
    {
       super.setText(Html.fromHtml(text.toString()), type);
    }
}

फिर, आप इसका उपयोग इस तरह कर सकते हैं (अपने पैकेज नाम के साथ PACKAGE_NAME को प्रतिस्थापित करें):

<PACKAGE_NAME.HTMLStyledTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="<![CDATA[
        <b>Bolded Text:</b> Non-Bolded Text
    ]]>"
/>

वास्तव में, एचटीएमएल ऑब्जेक्ट को छोड़कर, आप स्पैन करने योग्य प्रकार के वर्गों का उपयोग भी कर सकते हैं, जैसे टेक्स्टएपियरेंसस्पैन या टाइपफेसस्पैन और स्पैनेबलस्ट्रिंग टोगर। एचटीएमएल कक्षा इन तंत्रों का भी उपयोग करती है। लेकिन स्पैन करने योग्य प्रकार के वर्गों के साथ, आपके पास अधिक स्वतंत्रता है।


समर्थित टैग की सूची है:

यदि आप एक स्ट्रिंग संसाधन का उपयोग करते हैं, तो आप HTML नोटेशन का उपयोग करके बोल्ड या इटैलिक जैसे कुछ सरल स्टाइल जोड़ सकते हैं। वर्तमान में समर्थित टैग हैं: B (बोल्ड), I (इटालिक), U (अंडरलाइन), TT (मोनोस्पेस), BIG , SMALL , SUP (सुपरस्क्रिप्ट), SUB (सबस्क्रिप्ट), और स्ट्राइक (स्ट्राइकथ्रू)। तो, उदाहरण के लिए, res/values/strings.xml आप इसे घोषित कर सकते हैं:

<resource>
    <string id="@+id/styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string>
</resources>

( http://developer.android.com/guide/faq/commontasks.html#selectingtext - वेब आर्काइव लिंक, <resource> टाइपो मूल में है!)

यह भी दिखाता है कि सरल मामलों में Html.fromHtml की वास्तव में आवश्यकता नहीं है।


HTMLBuilder का उपयोग करके ऐसा करने का एक आसान तरीका यहां दिया गया है

    myTextView.setText(new HtmlBuilder().
                    open(HtmlBuilder.Type.BOLD).
                    append("Some bold text ").
                    close(HtmlBuilder.Type.BOLD).
                    open(HtmlBuilder.Type.ITALIC).
                    append("Some italic text").
                    close(HtmlBuilder.Type.ITALIC).
                    build()
    );

परिणाम:

कुछ बोल्ड टेक्स्ट कुछ इटालिक पाठ


Spanny करने योग्य स्ट्रिंग का उपयोग करना आसान बनाता है।

Spanny spanny = new Spanny("Underline text", new UnderlineSpan())
                .append("\nRed text", new ForegroundColorSpan(Color.RED))
                .append("\nPlain text");
textView.setText(spanny)

मैं भी

Kotlin और Anko साथ कुछ सुंदर मार्कअप का उपयोग करने के बारे में कैसे -

import org.jetbrains.anko.*
override fun onCreate(savedInstanceState: Bundle?) {
    title = "Created with Beautiful Markup"
    super.onCreate(savedInstanceState)

    verticalLayout {
        editText {
            hint = buildSpanned {
                append("Italic, ", Italic)
                append("highlighted", backgroundColor(0xFFFFFF00.toInt()))
                append(", Bold", Bold)
            }
        }
    }
}


यह स्ट्रिंग की लंबाई () विधि का लाभ उठाने जितना आसान हो सकता है:

  1. स्ट्रिंग्स एक्सएमएल फ़ाइल में टेक्स्ट स्ट्रिंग को कई उप-स्ट्रिंग्स (एंड्रॉइड के दृष्टिकोण से एक अलग तार) में विभाजित करें, जितना आपको विभिन्न शैलियों की आवश्यकता है, इसलिए यह ऐसा हो सकता है: str1, str2, str3 (जैसा कि आपके मामले में है) जो एक साथ जुड़ते हैं वे पूरी एकल स्ट्रिंग का उपयोग करते हैं।

  2. और उसके बाद बस "स्पैन" विधि का पालन करें, जैसा कि आपने अपने कोड के साथ प्रस्तुत किया है - लेकिन एक स्ट्रिंग के बजाय, सभी सबस्ट्रिंग्स को एक-दूसरे में विलय कर, प्रत्येक को एक अलग कस्टम शैली के साथ संयोजित करें।

आप अभी भी संख्याओं का उपयोग करते हैं, हालांकि सीधे नहीं - वे अब एक हार्डकोडेड फॉर्म (जैसे आपके कोड में) नहीं लेते हैं, लेकिन उन्हें संयुक्त लंबाई () विधियों के साथ प्रतिस्थापित किया जा रहा है (पहले दो सितारों को नोट करें और स्ट्रिंग को प्रत्ययित करें। परिवर्तन को खत्म करने के लिए पूर्ण संख्या के स्थान पर लंबाई ()):

str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, **str.length()**, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

पहले स्ट्रिंग आकार के लिए, फिर दूसरे स्ट्रिंग आकार के लिए str.length () + 1, str.length () + str2.length () , और सभी सबस्ट्रिंग्स के साथ, उदाहरण के लिए 0,7 या 8,19 और इसी तरह...





textview