আমার সহজ HTML রয়েছে :
<h2>Title</h2><br>
<p>description here</p>
আমি এটিতে HTML স্টাইলযুক্ত পাঠ্যটি প্রদর্শন করতে চাই TextView
। এই কিভাবে করবেন?
আমার সহজ HTML রয়েছে :
<h2>Title</h2><br>
<p>description here</p>
আমি এটিতে HTML স্টাইলযুক্ত পাঠ্যটি প্রদর্শন করতে চাই TextView
। এই কিভাবে করবেন?
উত্তর:
আপনার ব্যবহার করা দরকার Html.fromHtml()
আপনার এক্সএমএল স্ট্রিংগুলিতে আপনাকে HTML করতে হবে। আপনার লেআউটে XML এর সাথে কেবল কোনও স্ট্রিং উল্লেখ করা কার্যকর হবে না 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
কিছু মার্জিন সঙ্গে আসে। আপনি যদি ফাঁকটি না চান তবে আপনি অন্যান্য এইচটিএমএল উপাদানগুলি ব্যবহার করে বিবেচনা করতে পারেন।
android.text.Html.fromHtml
। আমি জানি বেশিরভাগ আইডিই আপনার জন্য এটি ঠিক করবে তবে পঠনের জন্য প্যাকেজের নামগুলি জানা ভাল know
, setText (Html.fromHtml (bodyData)) হয় অবচিত API 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>
এটি শুধুমাত্র কয়েকটি ট্যাগের জন্য কাজ করে।
আপনি যদি জাভা কোডে কোনও পরিবর্তন ছাড়াই এক্সএমএল এর মাধ্যমে এটি কনফিগার করতে সক্ষম হতে চান তবে আপনি এই ধারণাটিকে সহায়ক বলে মনে করতে পারেন। কেবলমাত্র আপনি কনস্ট্রাক্টর থেকে আর ডি কল করুন এবং পাঠ্যটিকে এইচটিএমএল হিসাবে সেট করেছেন
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"/>
আপনি যদি স্ট্রিং রিসোর্স আইডি থেকে এইচটিএমএল দেখানোর চেষ্টা করছেন তবে ফর্ম্যাটিংটি স্ক্রিনে নাও দেখাতে পারে। যদি এটি আপনার হয়ে থাকে তবে পরিবর্তে সিডিএটিএ ট্যাগ ব্যবহার করার চেষ্টা করুন:
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());
আপনি যদি কেবল কিছু এইচটিএমএল পাঠ্য প্রদর্শন করতে চান এবং সত্যই কোনও প্রয়োজন হয় না TextView
, তবে নিন WebView
এবং নীচের মতো ব্যবহার করুন:
String htmlText = ...;
webview.loadData(htmlText , "text/html; charset=UTF-8", null);
এটি আপনাকে কয়েকটি এইচটিএমএল ট্যাগেই সীমাবদ্ধ করে না।
layout_height="wrap_content"
। পরিবর্তে আপনাকে একটি সুস্পষ্ট উচ্চতা বা ম্যাচ_পিতা নির্ধারণ করতে হবে।
নীচের কোড স্নিপেটে টেক্সটভিউতে এইচটিএমএল বিষয়বস্তুর প্রকৃত প্রদর্শন পেতে স্ট্রিং.এক্সএমএল ফাইলে স্ট্রিংয়ের জন্য সিডিটা বিভাগগুলি ব্যবহার করার সর্বোত্তম পদ্ধতির আপনাকে ন্যায্য ধারণা দেবে।
//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));
স্ট্রিং টেক্সটে সিডিটা বিভাগ স্ট্রিং.ফর্ম্যাট পদ্ধতি ব্যবহার করে পাঠ্য বিন্যাস করার পরেও এইচটিএমএল ট্যাগ ডেটা অক্ষত রাখে। সুতরাং, Html.fromHtml (str) ভাল কাজ করে এবং আপনি স্বাগত বার্তায় সাহসী পাঠ্যটি দেখতে পাবেন।
আউটপুট:
স্বাগতম, আপনার প্রিয় সঙ্গীত অ্যাপ স্টোর এ। হিসাবে লগ ইন: ব্যবহারকারীর নাম
এটি উল্লেখ করার মতো যে এইচটিএমএল.ফর্মএইচটিএমএল (স্ট্রিং সোর্স) পদ্ধতিটি এপিআই স্তর ২৪ অনুসারে অবনতিযুক্ত । এটি যদি আপনার টার্গেট এপিআই হয় তবে আপনার পরিবর্তে Html.fromHtml (স্ট্রিং উত্স, অভ্যন্তরীণ পতাকা) ব্যবহার করা উচিত।
আমি নিম্নলিখিত প্রকল্পগুলিরও পরামর্শ দিতে চাই: https://github.com/NightWhistler/HtmlSpanner
ব্যবহার প্রায় ডিফল্ট অ্যান্ড্রয়েড রূপান্তরকারী হিসাবে একই:
(new HtmlSpanner()).fromHtml()
আমি ইতিমধ্যে এইচটিএমএলকে স্প্যানিয়েবল রূপান্তরকারী হিসাবে নিজস্ব প্রয়োগ করে শুরু করার পরে এটি পেয়েছি, কারণ মানক এইচটিএমএল.ফর্মএইচটিএমএল রেন্ডারিং নিয়ন্ত্রণের উপর পর্যাপ্ত নমনীয়তা সরবরাহ করে না এবং এমনকি টিটিএফ থেকে কাস্টম ফন্ট ব্যবহার করার কোনও সম্ভাবনাও দেয় না
আমি জানি এই প্রশ্নটি পুরানো। অন্যান্য উত্তর এখানে 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 সংস্করণ জুড়ে এইচটিএমএল শ্রেণীর মানককরণ এবং ব্যাকপোর্টের জন্য একটি সামঞ্জস্য লাইব্রেরিটি ব্যবহার করতে চাইতে পারেন যার মধ্যে উপাদান এবং স্টাইলিংয়ের জন্য আরও কলব্যাক রয়েছে:
এটি ফ্রেমওয়ার্কের এইচটিএমএল বর্গের মতো হলেও, আরও কলব্যাকের অনুমতি দেওয়ার জন্য কিছু স্বাক্ষর পরিবর্তনগুলি প্রয়োজন। এখানে গিটহাব পৃষ্ঠা থেকে নমুনা দেওয়া হয়েছে:
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);
আপনি যখনই কাস্টম পাঠ্য ভিউ বেসিক এইচটিএমএল সেট পাঠ্য বৈশিষ্ট্যটি লেখেন তখন কিছু ডিভাইস ফর্মটি অদৃশ্য হয়ে যাবে।
কাজেই আমাদের কাজ করার অতিরিক্ত পদক্ষেপগুলি অনুসরণ করা দরকার
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
এবং একটি সম্পাদনাযোগ্য ডিভি ট্যাগে আপনি যে সম্পাদনা করতে চান এবং সম্পাদনা করতে চান এটি এইচটিএমএল সন্নিবেশ করান। এইভাবে ব্যবহারকারী যখন ট্যাপ করেWebView
কীবোর্ডটি সম্পাদনা করার অনুমতি দেয়। সম্পাদিত এইচটিএমএল এবং ভয়েলা ফিরে পেতে তারা কেবল কিছু জাভাস্ক্রিপ্ট যুক্ত করেছে!
কোডটি এখানে:
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));