जवाबों:
यह प्राप्त किया जा सकता है यदि आप एक स्ट्रिंग संसाधन 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);
<u>
टैग के माध्यम से अंतर्निहित काम नहीं करता है, जैसे कि कभी-कभी यदि आप एक कस्टम फ़ॉन्ट का उपयोग कर रहे हैं। हालाँकि, अंतर्निहित प्रोग्राम द्वारा UnderlineSpan
मुझ पर विफल होना अभी तक है, इसलिए मैं इसे सबसे विश्वसनीय समाधान के रूप में सुझाऊंगा।
आप के साथ कोशिश कर सकते हैं
textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
| Paint.ANTI_ALIAS_FLAG
अच्छी तरह से करने की आवश्यकता हो सकती है या आप पाठ बहुत तेज देखेंगे। यह कम एपीआई में अधिक बार प्रकट होता है।
textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
ऊपर "स्वीकृत" उत्तर काम नहीं करता है (जब आप स्ट्रिंग का उपयोग करने की कोशिश करते हैं जैसे textView.setText(Html.fromHtml(String.format(getString(...), ...)))
।
जैसा कि दस्तावेज़ों में कहा गया है कि आपको बचना चाहिए (html संस्था एनकोडेड) के साथ आंतरिक टैग्स की ब्रैकेट खोलना <
, उदाहरण के लिए परिणाम इस तरह दिखना चाहिए:
<resource>
<string name="your_string_here">This is an <u>underline</u>.</string>
</resources>
फिर अपने कोड में आप के साथ पाठ सेट कर सकते हैं:
TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));
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"
/>
बटन और टेक्स्ट दृश्य के लिए यह सबसे आसान तरीका है:
बटन:
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);
अंडरस्कोर क्लिक करने योग्य बटन शैली देखें:
<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>
परिणाम:
ड्राइंग रेखांकित पाठ का सबसे हालिया दृष्टिकोण गीथहब पर उपलब्ध स्रोत कोड के साथ माध्यम पर रोमैन गाई द्वारा वर्णित है । यह नमूना आवेदन दो संभावित कार्यान्वयन को उजागर करता है:
मुझे पता है कि यह एक देर से जवाब है, लेकिन मैं एक समाधान के साथ आया था जो बहुत अच्छी तरह से काम करता है ... मैंने कोड में पाठ को रेखांकित करने के लिए एंथनी फोर्लोनी से जवाब लिया और 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 स्निपेट में अतिरिक्त विकल्प जोड़े हैं, यह दिखाने के लिए कि मेरा उदाहरण पाठ का रंग, आकार और शैली बदलने के साथ काम करता है ...
उम्मीद है की यह मदद करेगा!
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
विधि के बजाय एक क्लीनर तरीका उपयोग करना है
textView.getPaint().setUnderlineText(true);
और अगर आपको बाद में उस दृश्य के लिए रेखांकित करने की आवश्यकता है, जैसे कि एक पुनर्नवीनीकरण दृश्य में पुन: उपयोग किए गए दृश्य में, textView.getPaint().setUnderlineText(false);
मैंने इस 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>
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" />
एक अन्य समाधान एक कस्टम दृश्य बनाना है जो नीचे दिखाए गए अनुसार 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"
/>
मैंने शमूएल के उत्तर को सरल बनाया :
<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>
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);
}
}
}
sampleTextView.setText(R.string.sample_string);
इसके अलावा, निम्न कोड अंडरलाइन नहीं होगा:
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
आशा है कि ये आपकी मदद करेगा।
शीर्ष मतदान का उत्तर सही और सरल है। हालाँकि, कभी-कभी आप पाते हैं कि कुछ फ़ॉन्ट के लिए काम नहीं कर रहा है, लेकिन दूसरों के लिए काम कर रहा है। (जो समस्या मुझे अभी चीनी से निपटने के दौरान आई थी।)
समाधान केवल आपके पाठ दृश्य के लिए "WRAP_CONTENT" का उपयोग नहीं करता है, क्योंकि लाइन खींचने के लिए कोई अतिरिक्त स्थान नहीं है। आप अपने TextView को निश्चित ऊँचाई सेट कर सकते हैं, या Android का उपयोग कर सकते हैं: WRAP_CONTENT के साथ पेडिंगवेरिकल।
HtmlCompat.fromHtml(
String.format(context.getString(R.string.set_target_with_underline)),
HtmlCompat.FROM_HTML_MODE_LEGACY)
<string name="set_target_with_underline"><u>Set Target<u> </string>
Xml फ़ाइल में एस्केप प्रतीक पर ध्यान दें
मुझे एक समस्या थी जहां मैं एक कस्टम फ़ॉन्ट का उपयोग कर रहा हूं और संसाधन फ़ाइल ट्रिक ( <u>Underlined text</u>
) के साथ बनाई गई अंडरलाइन ने काम किया, लेकिन एंड्रॉइड अंडरलाइन को स्ट्राइक गर्त में बदलने में कामयाब रहा।
मैंने इस उत्तर का उपयोग स्वयं टेक्स्टव्यू के नीचे एक सीमा खींचने के लिए किया: https://stackoverflow.com/a/10732993/664449 । जाहिर है कि यह आंशिक रेखांकित पाठ या बहुस्तरीय पाठ के लिए काम नहीं करता है।