क्या मैं एंड्रॉइड लेआउट में पाठ को रेखांकित कर सकता हूं?


जवाबों:


1144

यह प्राप्त किया जा सकता है यदि आप एक स्ट्रिंग संसाधन xml फ़ाइल का उपयोग कर रहे हैं , जो HTML टैग्स का समर्थन करता है <b></b>, <i></i>और <u></u>

<resources>
    <string name="your_string_here">This is an <u>underline</u>.</string>
</resources>

यदि आप कोड के उपयोग से कुछ को रेखांकित करना चाहते हैं:

TextView textView = (TextView) view.findViewById(R.id.textview);
SpannableString content = new SpannableString("Content");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
textView.setText(content);

49
नमस्ते, मैंने उपरोक्त संसाधन xml कोड की कोशिश की और यह काम नहीं किया। यह एक सादे पाठ के रूप में <u> रेखांकित </ u> प्रदर्शित करता रहा
जोनाथन

4
इसे भी देखें: android.text.Html.fromHtml () जो एक स्पैन्ड को लौटाता है।
मार्क रेनॉफ

3
आपको इसे strings.xml फ़ाइल में टाइप करना चाहिए, इसे ऐड बटन से नहीं करना चाहिए। अन्यथा आपको यह & lt; u & gt; अपने
तार में। xml

3
मैं ऐसे मामलों में आया हूं जब <u>टैग के माध्यम से अंतर्निहित काम नहीं करता है, जैसे कि कभी-कभी यदि आप एक कस्टम फ़ॉन्ट का उपयोग कर रहे हैं। हालाँकि, अंतर्निहित प्रोग्राम द्वारा UnderlineSpanमुझ पर विफल होना अभी तक है, इसलिए मैं इसे सबसे विश्वसनीय समाधान के रूप में सुझाऊंगा।
Giulio Piancastelli

26
यह संपादक में दिखाई नहीं देगा, लेकिन जब आप आप ऐप शुरू करते हैं - यह रेखांकित किया जाएगा।
जीन डी'रामे जूल

534

आप के साथ कोशिश कर सकते हैं

textview.setPaintFlags(textview.getPaintFlags() |   Paint.UNDERLINE_TEXT_FLAG);

1
शायद एक मामूली बात है, लेकिन ओपी XML लेआउट फ़ाइल में इसे परिभाषित करना चाहता था; अन्यथा, यह एक महान समाधान है।
क्विष्णु

4
अगर आप इसे साफ़ करना चाहते हैं तो इस घोल का उपयोग करें
Bobs

2
इस समाधान को एक बटन के लिए भी इस्तेमाल किया जा सकता है
रूडी कुर्नियन

3
सावधान यदि आप कस्टम फोंट या इसी तरह का उपयोग करते हैं, तो आपको | Paint.ANTI_ALIAS_FLAGअच्छी तरह से करने की आवश्यकता हो सकती है या आप पाठ बहुत तेज देखेंगे। यह कम एपीआई में अधिक बार प्रकट होता है।
मार्टिन मार्कोसिनी

4
कोटलिन में:textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
अल्बर्ट विला केल्वो

72

ऊपर "स्वीकृत" उत्तर काम नहीं करता है (जब आप स्ट्रिंग का उपयोग करने की कोशिश करते हैं जैसे textView.setText(Html.fromHtml(String.format(getString(...), ...)))

जैसा कि दस्तावेज़ों में कहा गया है कि आपको बचना चाहिए (html संस्था एनकोडेड) के साथ आंतरिक टैग्स की ब्रैकेट खोलना &lt;, उदाहरण के लिए परिणाम इस तरह दिखना चाहिए:

<resource>
    <string name="your_string_here">This is an &lt;u&gt;underline&lt;/u&gt;.</string>
</resources>

फिर अपने कोड में आप के साथ पाठ सेट कर सकते हैं:

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));

4
<u> यहां रेखांकित </ u> पूरी तरह से काम करता है। & lt; u> अंडरलाइन & lt; / u> काम नहीं किया। यह एंड्रॉयड 2.2 के लिए है। शायद अलग-अलग संस्करण इसकी अलग-अलग व्याख्या करते हैं।
user898763452

@autotravis 2.2 किसके लिए है? मैंने पुराने संस्करणों पर इसका परीक्षण नहीं किया है और यह काफी दुर्भाग्यपूर्ण होगा यदि विभिन्न संस्करण इसे अलग तरह से संभालते हैं ... साथ ही कम से कम वर्तमान प्रलेखन में कहा गया है कि इसे बचाना होगा (लिंक उत्तर में है)।
ओग्यान

मैंने Android 2.3 पर <u> रेखांकित </ u> परीक्षण किया है और यह काम करता है। & lt; u> अंडरलाइन & lt; / u> 2.3 के लिए काम नहीं करता है। डॉक्स कहते हैं "कभी-कभी आप एक स्टाइल टेक्स्ट संसाधन बनाना चाहते हैं जो कि प्रारूप स्ट्रिंग के रूप में भी उपयोग किया जाता है। आम तौर पर, यह काम नहीं करेगा क्योंकि String.format (स्ट्रिंग, ऑब्जेक्ट ...) विधि सभी स्टाइल जानकारी को छीन लेगी। स्ट्रिंग से। वर्क-अराउंड को बची हुई संस्थाओं के साथ HTML टैग्स लिखना है, जो तब प्रारूपित होने के बाद HHtml (स्ट्रिंग) से पुनर्प्राप्त किए जाते हैं। " तो मुझे लगता है कि आप उस String.format (...) विधि के माध्यम से इसे चलाने से बचने का उपयोग करेंगे।
user898763452

@autotravis हाँ, आप सही हैं। मैं इसे String.format (...) के साथ उपयोग करता हूं। मैंने अपना उत्तर संपादित कर दिया है, आपकी प्रतिक्रिया के लिए धन्यवाद।
ओग्यान

2.3 और 4.1 पर (केवल मैंने अब तक की कोशिश की) आप केवल getString (), Html.fromHtml () और String.format () का उपयोग करने के बजाय textView.setText (getText (R.string.text)) का उपयोग कर सकते हैं।
रॉय सोलबर्ग

59

Strings.xml फ़ाइल सामग्री:

<resource>
     <string name="my_text">This is an <u>underline</u>.</string> 
</resources> 

लेआउट xml फ़ाइल शॉल्ड टेक्स्टव्यू के गुणों के साथ उपरोक्त स्ट्रिंग संसाधन का उपयोग करें, जैसा कि नीचे दिखाया गया है:

<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:text="@string/my_text"

    android:selectAllOnFocus="false"
    android:linksClickable="false"
    android:autoLink="all"
    />

3
सुनिश्चित करें कि आप एक्लिप्स में सहायक संपादन UI के अंदर के बजाय वास्तविक XML के अंदर स्ट्रिंग संसाधन फ़ाइल को संपादित करते हैं, इससे <s बच जाएगा।
क्रिस राए

51

बटन और टेक्स्ट दृश्य के लिए यह सबसे आसान तरीका है:

बटन:

Button button = (Button) findViewById(R.id.btton1);
button.setPaintFlags(button.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

व्याख्यान दर्शन:

TextView textView = (TextView) findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

बहुत सुरुचिपूर्ण समाधान। धन्यवाद!
एड्रियन

20

एक लाइन समाधान

myTextView.setText(Html.fromHtml("<p><u>I am Underlined text</u></p>"));

यह थोड़ा देर से है, लेकिन किसी के लिए उपयोगी हो सकता है।


19

कोटलिन विस्तार समारोह में इस्तेमाल किया जा सकता है। यह केवल कोड से उपयोग किया जा सकता है, xml से नहीं।

fun TextView.underline() {
    paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG
}

उपयोग:

 tv_change_number.underline()
 tv_resend_otp.underline()

13

अंडरस्कोर क्लिक करने योग्य बटन शैली देखें:

<TextView
    android:id="@+id/btn_some_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/btn_add_contact"
    android:textAllCaps="false"
    android:textColor="#57a0d4"
    style="@style/Widget.AppCompat.Button.Borderless.Colored" />

strings.xml:

<string name="btn_add_contact"><u>Add new contact</u></string>

परिणाम:

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


Widget.AppCompat.Button.Borderless.Colored का लुक और अहसास अंडरलाइनिंग की तुलना में काफी बेहतर है, हालाँकि, जैसा कि @Kiril Vashilo ने बताया है, आप इसे वैसे भी कर सकते हैं।
xarlymg89

11

ड्राइंग रेखांकित पाठ का सबसे हालिया दृष्टिकोण गीथहब पर उपलब्ध स्रोत कोड के साथ माध्यम पर रोमैन गाई द्वारा वर्णित है । यह नमूना आवेदन दो संभावित कार्यान्वयन को उजागर करता है:

  • एक पथ-आधारित कार्यान्वयन जिसके लिए एपीआई स्तर 19 की आवश्यकता होती है
  • एक क्षेत्र-आधारित कार्यान्वयन जिसके लिए एपीआई स्तर 1 की आवश्यकता होती है

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


10

मुझे पता है कि यह एक देर से जवाब है, लेकिन मैं एक समाधान के साथ आया था जो बहुत अच्छी तरह से काम करता है ... मैंने कोड में पाठ को रेखांकित करने के लिए एंथनी फोर्लोनी से जवाब लिया और TextView का एक उपवर्ग बनाया जो आपके लिए संभालता है। तब आप बस XML में उपवर्ग का उपयोग कर सकते हैं जब भी आप एक रेखांकित TextView चाहते हैं।

यहाँ मैंने जो वर्ग बनाया है:

import android.content.Context;
import android.text.Editable;
import android.text.SpannableString;
import android.text.TextWatcher;
import android.text.style.UnderlineSpan;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * Created with IntelliJ IDEA.
 * User: Justin
 * Date: 9/11/13
 * Time: 1:10 AM
 */
public class UnderlineTextView extends TextView
{
    private boolean m_modifyingText = false;

    public UnderlineTextView(Context context)
    {
        super(context);
        init();
    }

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

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

    private void init()
    {
        addTextChangedListener(new TextWatcher()
        {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after)
            {
                //Do nothing here... we don't care
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count)
            {
                //Do nothing here... we don't care
            }

            @Override
            public void afterTextChanged(Editable s)
            {
                if (m_modifyingText)
                    return;

                underlineText();
            }
        });

        underlineText();
    }

    private void underlineText()
    {
        if (m_modifyingText)
            return;

        m_modifyingText = true;

        SpannableString content = new SpannableString(getText());
        content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
        setText(content);

        m_modifyingText = false;
    }
}

अब ... जब भी आप XML में एक रेखांकित पाठ बनाना चाहते हैं, आप बस निम्नलिखित कार्य करें:

<com.your.package.name.UnderlineTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:gravity="center"
    android:text="This text is underlined"
    android:textColor="@color/blue_light"
    android:textSize="12sp"
    android:textStyle="italic"/>

मैंने इस XML स्निपेट में अतिरिक्त विकल्प जोड़े हैं, यह दिखाने के लिए कि मेरा उदाहरण पाठ का रंग, आकार और शैली बदलने के साथ काम करता है ...

उम्मीद है की यह मदद करेगा!


2
जब यह उदाहरण काम करता है, तो मुझे जल्दी से एहसास हुआ कि अगर आप एक्सएमएल में अतिरिक्त नियंत्रण रखना चाहते हैं, तो यह बस नहीं चलेगा ... मैंने एक बेहतर समाधान पर स्विच किया है जिसमें निम्नलिखित चरण शामिल हैं: 1) उपवर्ग टेक्स्टव्यू 2) समर्थन जोड़ें ऊपर बताए अनुसार रेखांकित करने के लिए कस्टम विशेषताओं के माध्यम से पाठ को रेखांकित करने के लिए। एकमात्र अंतर यह है कि आप केवल अंडरलाइन कोड निष्पादित करते हैं यदि कस्टम विशेषता सेट की जाती है।
जस्टिन

10


textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); विधि के बजाय एक क्लीनर तरीका उपयोग करना है textView.getPaint().setUnderlineText(true);

और अगर आपको बाद में उस दृश्य के लिए रेखांकित करने की आवश्यकता है, जैसे कि एक पुनर्नवीनीकरण दृश्य में पुन: उपयोग किए गए दृश्य में, textView.getPaint().setUnderlineText(false);


7

जैसे स्ट्रिंग संसाधन फ़ाइल में विशेषता का उपयोग करें

<string name="example"><u>Example</u></string>

7

मैंने इस xml को नीचे-बॉर्डर बनाने के लिए उपयोग करने योग्य बनाया और ड्रॉबल को अपने टेक्स्टव्यू की पृष्ठभूमि के रूप में लागू किया

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle" >
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>

    <item android:top="-5dp" android:right="-5dp" android:left="-5dp">
        <shape>
            <solid android:color="@android:color/transparent" />
            <stroke
                    android:width="1.5dp"
                    android:color="@color/pure_white" />
        </shape>
    </item>
</layer-list>

यह कस्टम रंग के साथ सभी दृश्य रेखांकन के लिए सही समाधान है। यहां पारदर्शी पृष्ठभूमि का अनादर न करें, एंड्रॉइड 4 के लिए यह आवश्यक है, आपके विचार में काला पृष्ठभूमि w / o होगा
इवान मित्सुरा

5

Xml में एक सरल और लचीला समाधान:

<View
  android:layout_width="match_parent"
  android:layout_height="3sp"
  android:layout_alignLeft="@+id/your_text_view_need_underline"
  android:layout_alignRight="@+id/your_text_view_need_underline"
  android:layout_below="@+id/your_text_view_need_underline"
  android:background="@color/your_color" />

4

एक अन्य समाधान एक कस्टम दृश्य बनाना है जो नीचे दिखाए गए अनुसार TextView का विस्तार करता है

public class UnderLineTextView extends TextView {

    public UnderLineTextView(Context context) {
        super(context);
        this.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
    }

    public UnderLineTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
    }

}

और बस नीचे दिखाए गए अनुसार xml जोड़ें

<yourpackage.UnderLineTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="underline text"
 />

बहुत बढ़िया!! लेकिन अंडरलाइन का रंग ग्रे है इसे काले या किसी अन्य रंग में कैसे बदलना है?
ओह्हहत वीरुन

3

मैंने शमूएल के उत्तर को सरल बनाया :

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--https://stackoverflow.com/a/40706098/4726718-->
    <item
        android:left="-5dp"
        android:right="-5dp"
        android:top="-5dp">
        <shape>
            <stroke
                android:width="1.5dp"
                android:color="@color/colorAccent" />
        </shape>
    </item>
</layer-list>

3

मैंने आसानी के लिए इस विधि का निर्माण किया

TextView tv = findViewById(R.id.tv);
tv.setText("some text");

पूरे TextView को रेखांकित करें

setUnderLineText(tv, tv.getText().toString());

TextView के कुछ भाग को रेखांकित करें

setUnderLineText(tv, "some");

इसके अलावा EditText, Button, Checkbox जैसे TextView childs का समर्थन करें

public void setUnderLineText(TextView tv, String textToUnderLine) {
        String tvt = tv.getText().toString();
        int ofe = tvt.indexOf(textToUnderLine, 0);

        UnderlineSpan underlineSpan = new UnderlineSpan();
        SpannableString wordToSpan = new SpannableString(tv.getText());
        for (int ofs = 0; ofs < tvt.length() && ofe != -1; ofs = ofe + 1) {
            ofe = tvt.indexOf(textToUnderLine, ofs);
            if (ofe == -1)
                break;
            else {
                wordToSpan.setSpan(underlineSpan, ofe, ofe + textToUnderLine.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                tv.setText(wordToSpan, TextView.BufferType.SPANNABLE);
            }
        }
    }

क्लिक करने योग्य अंडरलाइन टेक्स्ट बनाने या टेक्स्ट व्यू के कई हिस्सों को रेखांकित करने के लिए यहां मेरे उत्तर की जांच करें


2

इस कोड को आज़माएं

XML में

<resource>
 <string name="my_text"><![CDATA[This is an <u>underline</u>]]></string> 
</resources> 

कोड में

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(getString(R.string.my_text)));

शुभ लाभ!


2
  1. Strings.xml संसाधन फ़ाइल पर जाएँ
  2. जहाँ आवश्यक हो, HTML अंडरलाइन टैग के साथ संसाधन फ़ाइल में स्ट्रिंग जोड़ें।

strings.xml HTML नमूने को रेखांकित करता है

  1. निम्नलिखित के रूप में अपने जावा कोड में स्ट्रिंग संसाधन आईडी को कॉल करें:
sampleTextView.setText(R.string.sample_string);
  1. आउटपुट में शब्द "Stackoverflow" होना चाहिए।

इसके अलावा, निम्न कोड अंडरलाइन नहीं होगा:

String sampleString = getString(R.string.sample_string);
sampleTextView.setText(sampleString);

इसके बजाय, अमीर पाठ प्रारूप बनाए रखने के लिए निम्न कोड का उपयोग करें:

CharSequence sampleString = getText(R.string.sample_string);
sampleTextView.setText(sampleString);

"आप किसी स्ट्रिंग को पुनः प्राप्त करने के लिए getString (int) या getText (int) का उपयोग कर सकते हैं। getText (int) स्ट्रिंग पर लागू किसी भी समृद्ध पाठ स्टाइल को बरकरार रखता है।" Android प्रलेखन।

प्रलेखन देखें: https://developer.android.com/guide/topics/resource/string-resource.html

आशा है कि ये आपकी मदद करेगा।


2

शीर्ष मतदान का उत्तर सही और सरल है। हालाँकि, कभी-कभी आप पाते हैं कि कुछ फ़ॉन्ट के लिए काम नहीं कर रहा है, लेकिन दूसरों के लिए काम कर रहा है। (जो समस्या मुझे अभी चीनी से निपटने के दौरान आई थी।)

समाधान केवल आपके पाठ दृश्य के लिए "WRAP_CONTENT" का उपयोग नहीं करता है, क्योंकि लाइन खींचने के लिए कोई अतिरिक्त स्थान नहीं है। आप अपने TextView को निश्चित ऊँचाई सेट कर सकते हैं, या Android का उपयोग कर सकते हैं: WRAP_CONTENT के साथ पेडिंगवेरिकल।


1
HtmlCompat.fromHtml(
                    String.format(context.getString(R.string.set_target_with_underline)),
                    HtmlCompat.FROM_HTML_MODE_LEGACY)
<string name="set_target_with_underline">&lt;u>Set Target&lt;u> </string>

Xml फ़ाइल में एस्केप प्रतीक पर ध्यान दें


भागने के सिम्बोल के साथ मेरे लिए काम किया, धन्यवाद!
बद्र

1

कोटलिन में ऐसा करने के लिए:

yourTextView.paint?.isUnderlineText = true


0

इसका उत्तर देने में काफी देर हो गई, लेकिन मान लीजिए कि यदि कोई भी पाठ को गतिशील रूप से प्राप्त करना चाहता है, तो वे अपने जावा कोड में इस सरल एक पंक्ति का उपयोग कर सकते हैं:

 textView.setText(Html.fromHtml("<p><u>" + get_name + "</u></p>"));

-2

मुझे एक समस्या थी जहां मैं एक कस्टम फ़ॉन्ट का उपयोग कर रहा हूं और संसाधन फ़ाइल ट्रिक ( <u>Underlined text</u>) के साथ बनाई गई अंडरलाइन ने काम किया, लेकिन एंड्रॉइड अंडरलाइन को स्ट्राइक गर्त में बदलने में कामयाब रहा।

मैंने इस उत्तर का उपयोग स्वयं टेक्स्टव्यू के नीचे एक सीमा खींचने के लिए किया: https://stackoverflow.com/a/10732993/664449 । जाहिर है कि यह आंशिक रेखांकित पाठ या बहुस्तरीय पाठ के लिए काम नहीं करता है।

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