मेरे पास सरल HTML है :
<h2>Title</h2><br>
<p>description here</p>
मैं HTML स्टाइल टेक्स्ट को इसमें प्रदर्शित करना चाहता हूं TextView
। यह कैसे करना है?
मेरे पास सरल HTML है :
<h2>Title</h2><br>
<p>description here</p>
मैं HTML स्टाइल टेक्स्ट को इसमें प्रदर्शित करना चाहता हूं TextView
। यह कैसे करना है?
जवाबों:
आपको Html.fromHtml()
अपने XML स्ट्रिंग्स में HTML का उपयोग करने की आवश्यकता है । बस अपने लेआउट में HTML के साथ एक स्ट्रिंग को संदर्भित करना XML काम नहीं करेगा।
यही आपको करना चाहिए:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
textView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>", Html.FROM_HTML_MODE_COMPACT));
} else {
textView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>"));
}
h2
परिभाषा के अनुसार अपने आप में बहुत अंतर पैदा करता है। और p
कुछ मार्जिन के साथ भी आता है। यदि आप अंतर नहीं चाहते हैं, तो आप अन्य HTML तत्वों का उपयोग करने पर विचार कर सकते हैं।
android.text.Html.fromHtml
। मुझे पता है कि अधिकांश IDE आपके लिए इसे ठीक कर देंगे लेकिन पठनीयता के लिए पैकेज के नामों को जानना अच्छा होगा।
setText (Html.fromHtml (bodyData)) है पदावनत एपीआई 24. के बाद अब आप यह करने के लिए है:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
tvDocument.setText(Html.fromHtml(bodyData,Html.FROM_HTML_MODE_LEGACY));
} else {
tvDocument.setText(Html.fromHtml(bodyData));
}
इस पर एक नज़र: https://stackoverflow.com/a/8558249/450148
यह बहुत अच्छा है !!
<resource>
<string name="your_string">This is an <u>underline</u> text demo for TextView.</string>
</resources>
यह केवल कुछ टैग के लिए काम करता है।
आप इस विचार से सहायक हो सकता आप जावा कोड में किसी भी संशोधन के बिना एक्सएमएल के माध्यम से यह कॉन्फ़िगर करने के लिए सक्षम होने के लिए चाहते हैं। बस आप निर्माता से init को कॉल करते हैं और टेक्स्ट को html के रूप में सेट करते हैं
public class HTMLTextView extends TextView {
... constructors calling init...
private void init(){
setText(Html.fromHtml(getText().toString()));
}
}
xml:
<com.package.HTMLTextView
android:text="@string/about_item_1"/>
यदि आप HTML को स्ट्रिंग संसाधन आईडी से दिखाने का प्रयास कर रहे हैं, तो स्वरूपण स्क्रीन पर दिखाई नहीं दे सकता है। कि आप के लिए हो रहा है, तो इसके बजाय CDATA टैग का उपयोग का प्रयास करें:
strings.xml:
<string name="sample_string"><![CDATA[<h2>Title</h2><br><p>Description here</p>]]></string>
...
MainActivity.java:
text.setText(Html.fromHtml(getString(R.string.sample_string));
अधिक जानकारी के लिए इस पोस्ट को देखें।
नीचे दिए गए कोड मेरे लिए सबसे अच्छा परिणाम दे दी है।
TextView myTextview = (TextView) findViewById(R.id.my_text_view);
htmltext = <your html (markup) character>;
Spanned sp = Html.fromHtml(htmltext);
myTextview.setText(sp);
String value = "<html> <a href=\"http://example.com/\">example.com</a> </html>";
SiteLink= (TextView) findViewById(R.id.textViewSite);
SiteLink.setText(Html.fromHtml(value));
SiteLink.setMovementMethod(LinkMovementMethod.getInstance());
यदि आप केवल कुछ html पाठ प्रदर्शित करना चाहते हैं और वास्तव में इसकी आवश्यकता नहीं है TextView
, तो एक WebView
का उपयोग करें और इसे निम्नलिखित की तरह उपयोग करें:
String htmlText = ...;
webview.loadData(htmlText , "text/html; charset=UTF-8", null);
यह आपको कुछ html टैग तक सीमित नहीं करता है।
layout_height="wrap_content"
। आपको इसके बजाय एक स्पष्ट ऊँचाई या माचिस सेट करनी होगी।
सबसे अच्छा तरीका strings.xml फ़ाइल में स्ट्रिंग के लिए CDATA भाग का उपयोग करने के लिए नीचे दिए गए कोड स्निपेट TextView के लिए html सामग्री की एक वास्तविक प्रदर्शन प्राप्त करने के लिए आप उचित विचार दे देंगे।
//in string.xml file
<string name="welcome_text"><![CDATA[<b>Welcome,</b> to the forthetyroprogrammers blog Logged in as:]]> %1$s.</string>
//and in Java code
String welcomStr=String.format(getString(R.string.welcome_text),username);
tvWelcomeUser.setText(Html.fromHtml(welcomStr));
स्ट्रिंग टेक्स्ट में सीडीटा सेक्शन String.format मेथड का उपयोग करके टेक्स्ट को फॉर्मेट करने के बाद भी html टैग डेटा को बरकरार रखता है। तो, Html.fromHtml (एसटीआर) ठीक काम करता है और आप में आपका स्वागत है संदेश में बोल्ड टेक्स्ट देखेंगे।
आउटपुट:
आपका स्वागत है, अपने पसंदीदा संगीत app की दुकान करने के लिए। के रूप में लॉग इन करें: उपयोगकर्ता नाम
यह ध्यान देने योग्य है कि विधि Html.fromHtml (स्ट्रिंग स्रोत) एपीआई स्तर 24 के रूप में पदावनत है। यदि यह आपका लक्ष्य एपीआई है, तो आपको इसके बजाय Html.fromHtml (स्ट्रिंग स्रोत, int ध्वज) का उपयोग करना चाहिए ।
मैं निम्नलिखित प्रोजेक्ट का सुझाव भी देना चाहूंगा: https://github.com/NightWhistler/HtmlSpanner
उपयोग लगभग डिफ़ॉल्ट एंड्रॉइड कनवर्टर के समान है:
(new HtmlSpanner()).fromHtml()
यह मेरे द्वारा पहले ही शुरू कर दिया गया था कि html के अपने कार्यान्वयन के लिए स्पैनेबल कनवर्टर द्वारा शुरू किया गया है, क्योंकि मानक Html.fromHtml नियंत्रण प्रदान करने के लिए पर्याप्त लचीलापन प्रदान नहीं करता है और यहां तक कि ttf से कस्टम फोंट का उपयोग करने की कोई संभावना नहीं है।
मुझे पता है कि यह सवाल पुराना है। अन्य उत्तर यहाँ सुझाव Html.fromHtml()
विधि है। मैं आपको पैकेज HtmlCompat.fromHtml()
से उपयोग करने का सुझाव देता हूं androidx.core.text.HtmlCompat
। जैसा कि यह Html
वर्ग का पिछड़ा संगत संस्करण है ।
नमूना कोड:
import androidx.core.text.HtmlCompat;
import android.text.Spanned;
import android.widget.TextView;
String htmlString = "<h1>Hello World!</h1>";
Spanned spanned = HtmlCompat.fromHtml(htmlString, HtmlCompat.FROM_HTML_MODE_COMPACT);
TextView tvOutput = (TextView) findViewById(R.id.text_view_id);
tvOutput.setText(spanned);
इस तरह से आप एंड्रॉयड एपीआई संस्करण की जांच से बच सकते हैं और यह उपयोग (एकल लाइन समाधान) आसान है।
सरल उपयोग Html.fromHtml("html string")
। यह काम करेगा। यदि स्ट्रिंग में टैग हैं <h1>
तो रिक्त स्थान आएंगे। लेकिन हम उन जगहों को खत्म नहीं कर सकते। यदि आप अभी भी रिक्त स्थान हटाना चाहते हैं, तो आप स्ट्रिंग में टैग हटा सकते हैं और फिर स्ट्रिंग को विधि में पास कर सकते हैं Html.fromHtml("html string");
। आम तौर पर ये तार सर्वर (डायनेमिक) से आते हैं, लेकिन अक्सर नहीं, अगर स्ट्रिंग को पास करना बेहतर होता है क्योंकि यह विधि से है स्ट्रिंग से टैग को हटाने की कोशिश करें।
String value = html value ....
mTextView.setText(Html.fromHtml(value),TextView.BufferType.SPANNABLE)
एक वैश्विक विधि बनाएं जैसे:
public static Spanned stripHtml(String html) {
if (!TextUtils.isEmpty(html)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return Html.fromHtml(html, Html.FROM_HTML_MODE_COMPACT);
} else {
return Html.fromHtml(html);
}
}
return null;
}
आप इसे अपनी गतिविधि / प्रसार में भी उपयोग कर सकते हैं जैसे:
text_view.setText(stripHtml(htmlText));
मैंने वेब दृश्य का उपयोग करके इसे लागू किया है। मेरे मामले में मुझे पाठ दृश्य में पाठ के साथ URL से छवि लोड करनी है और यह मेरे लिए काम करता है।
WebView myWebView =new WebView(_context);
String html = childText;
String mime = "text/html";
String encoding = "utf-8";
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.loadDataWithBaseURL(null, html, mime, encoding, null);
एचटीएमएल फ्रेमवर्क वर्ग का उपयोग करने के लिए विभिन्न उत्तरों के माध्यम से सुझाव दिया गया है जैसा कि यहां बताया गया है, लेकिन दुर्भाग्य से इस वर्ग में एंड्रॉइड के विभिन्न संस्करणों और विभिन्न अनसुनी बग्स में अलग-अलग व्यवहार है, जैसा कि 214637 , 14778 , 235128 और 75953 के मुद्दों में दिखाया गया है ।
इसलिए आप Android संस्करणों में Html वर्ग के मानकीकरण और बैकपोर्ट के लिए एक संगतता पुस्तकालय का उपयोग करना चाह सकते हैं जिसमें तत्वों और स्टाइल के लिए अधिक कॉलबैक शामिल हैं:
हालांकि यह फ्रेमवर्क के एचटीएमएल वर्ग के समान है, अधिक कॉलबैक की अनुमति देने के लिए कुछ हस्ताक्षर परिवर्तनों की आवश्यकता थी। यहाँ GitHub पृष्ठ से नमूना लिया गया है:
Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0);
// You may want to provide an ImageGetter, TagHandler and SpanCallback:
//Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0,
// imageGetter, tagHandler, spanCallback);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(fromHtml);
जब भी आप कस्टम टेक्स्ट व्यू लिखते हैं तो बेसिक HTML सेट टेक्स्ट फीचर को कुछ डिवाइसों से गायब कर दिया जाएगा।
तो हम निम्नलिखित addtional कदम बनाने की जरूरत है काम है
public class CustomTextView extends TextView {
public CustomTextView(..) {
// other instructions
setText(Html.fromHtml(getText().toString()));
}
}
public class HtmlTextView extends AppCompatTextView {
public HtmlTextView(Context context) {
super(context);
init();
}
private void init(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
setText(Html.fromHtml(getText().toString(), Html.FROM_HTML_MODE_COMPACT));
} else {
setText(Html.fromHtml(getText().toString()));
}
}
}
उत्तर का अद्यतन
समाधान प्राप्त करने के लिए नीचे दिए गए कोड का उपयोग करें:
textView.setText(fromHtml("<Your Html Text>"))
यूटिलिटी विधि
public static Spanned fromHtml(String text)
{
Spanned result;
if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
result = Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY);
} else {
result = Html.fromHtml(text);
}
return result;
}
मैं कुछ हद तक अभी भी प्रतिभाशाली समाधान सुझा सकते हैं! मुझे इस लेख से विचार मिला और इसे एंड्रॉइड के लिए अनुकूलित किया। मूल रूप से आप एक का उपयोग करते हैं WebView
और उस HTML को सम्मिलित करते हैं जिसे आप संपादन योग्य div टैग में दिखाना और संपादित करना चाहते हैं। इस तरह जब उपयोगकर्ता टैप करता है WebView
तो कीबोर्ड दिखाई देता है और संपादन की अनुमति देता है। वे आपके द्वारा संपादित किए गए HTML और वॉइला को वापस लाने के लिए कुछ जावास्क्रिप्ट जोड़ते हैं!
यहाँ कोड है:
public class HtmlTextEditor extends WebView {
class JsObject {
// This field always keeps the latest edited text
public String text;
@JavascriptInterface
public void textDidChange(String newText) {
text = newText.replace("\n", "");
}
}
private JsObject mJsObject;
public HtmlTextEditor(Context context, AttributeSet attrs) {
super(context, attrs);
getSettings().setJavaScriptEnabled(true);
mJsObject = new JsObject();
addJavascriptInterface(mJsObject, "injectedObject");
setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
loadUrl(
"javascript:(function() { " +
" var editor = document.getElementById(\"editor\");" +
" editor.addEventListener(\"input\", function() {" +
" injectedObject.textDidChange(editor.innerHTML);" +
" }, false)" +
"})()");
}
});
}
public void setText(String text) {
if (text == null) { text = ""; }
String editableHtmlTemplate = "<!DOCTYPE html>" + "<html>" + "<head>" + "<meta name=\"viewport\" content=\"initial-scale=1.0\" />" + "</head>" + "<body>" + "<div id=\"editor\" contenteditable=\"true\">___REPLACE___</div>" + "</body>" + "</html>";
String editableHtml = editableHtmlTemplate.replace("___REPLACE___", text);
loadData(editableHtml, "text/html; charset=utf-8", "UTF-8");
// Init the text field in case it's read without editing the text before
mJsObject.text = text;
}
public String getText() {
return mJsObject.text;
}
}
और यहाँ एक जिस्ट के रूप में घटक है।
नोट: मुझे मूल समाधान से ऊंचाई परिवर्तन कॉलबैक की आवश्यकता नहीं थी, इसलिए यहां गायब है, लेकिन यदि आवश्यक हो तो आप इसे आसानी से जोड़ सकते हैं।
यदि आप androidx.
अपनी परियोजना में * वर्गों का उपयोग करते हैं, तो आपको उपयोग करना चाहिए HtmlCompat.fromHtml(text, flag)
। विधि का स्रोत है:
@NonNull
public static Spanned fromHtml(@NonNull String source, @FromHtmlFlags int flags) {
if (Build.VERSION.SDK_INT >= 24) {
return Html.fromHtml(source, flags);
}
//noinspection deprecation
return Html.fromHtml(source);
}
यह Html.fromHtml से बेहतर तरीका है क्योंकि इसमें कम कोड है, केवल एक लाइन है, और इसे इस्तेमाल करने के लिए अनुशंसित तरीका है।
आप इस तरह सरल कोटलिन एक्सटेंशन फ़ंक्शन का उपयोग कर सकते हैं:
fun TextView.setHtmlText(source: String) {
this.text = HtmlCompat.fromHtml(source, HtmlCompat.FROM_HTML_MODE_LEGACY)
}
और उपयोग:
textViewMessage.setHtmlText("Message: <b>Hello World</b>")
बस उपयोग करें:
String variable="StackOverflow";
textView.setText(Html.fromHtml("<b>Hello : </b>"+ variable));