এক্সএমএলে এইচটিএমএল-ফর্ম্যাট স্ট্রিং রিসোর্স থেকে টেক্সটভিউ পাঠ্য সেট করুন


195

আমার ভিতরে কিছু নির্দিষ্ট স্ট্রিং রয়েছে strings.xml, এরকম কিছু:

<resources>
    <string name="somestring">
        <B>Title</B><BR/>
        Content
    </string>
</resources>

এবং আমার বিন্যাসে আমি একটি পেয়েছি TextViewযা আমি এইচটিএমএল-ফর্ম্যাট স্ট্রিং দিয়ে পূরণ করতে চাই।

<TextView android:id="@+id/formattedtext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/htmlstring"/>

যদি আমি formattedtextএটি করি তবে এর somestringলিখিত সামগ্রীটি হ'ল কোনও HTML ট্যাগ ছাঁটাই করে ফর্ম্যাট করা যায় না।

আমি জানি যে এর সাথে প্রোগ্রাম্যাটিকভাবে ফর্ম্যাট পাঠ্য সেট করা সম্ভব

.setText(Html.fromHtml(somestring));

কারণ আমি এটি আমার প্রোগ্রামের অন্যান্য অংশে এটি ব্যবহার করি যেখানে এটি প্রত্যাশার মতো কাজ করে।

এই ফাংশনটি কল করার জন্য আমার একটি দরকার Activity, তবে এই মুহুর্তে আমার লেআউটটি সরল এক্সএমএলটিতে কেবল একটি সহজ বা কম স্ট্যাটিক ভিউ এবং আমি Activityকিছু সেট করার জন্য একটি ওভারহেড থেকে আমাকে বাঁচাতে এইভাবে ছেড়ে যেতে পছন্দ করব পাঠ্য।

আমি কি সুস্পষ্ট কিছু উপেক্ষা করছি? এটা কি আদৌ সম্ভব নয়? কোন সহায়তা বা workaround স্বাগত!

সম্পাদনা: সবেমাত্র কিছু জিনিস চেষ্টা করে দেখে মনে হয়েছে যে এক্সএমএলে এইচটিএমএল ফর্ম্যাটিংয়ে কিছু বাধা রয়েছে:

  • ট্যাগগুলি অবশ্যই ছোট হাতের লেখা উচিত

  • এখানে উল্লিখিত কিছু ট্যাগগুলি কার্যকর হয় না, যেমন <br/>( \nপরিবর্তে এটি ব্যবহার করা সম্ভব )


1
দীর্ঘকাল আমি জানি, তবে আমি একটি পাঠ্য ভিউয়ের জন্য এইচটিএমএল ব্যবহার করে একটি নতুন লাইনের জন্য <br> n না, তবে অনলাইন ব্যবহার করতে সক্ষম হয়েছি।
টাম

2
এই মাত্র xML থেকে কাজ করতে পারেন? উত্তরে আমার একটা ছোট অনুগ্রহ আছে। আমি ইতিমধ্যে ইতিমধ্যে এটির কোডিং করেছি এই মুহুর্তে সত্যিক উত্তর হিসাবে গ্রহণ করব না।
danny117

1
আমি এটি আকর্ষণীয় মনে করি যে আসলে কেউই প্রশ্নের উত্তর দেয় না। ওপিতে বলা হয়েছে যে এটি এইচটিএমএল () এর মাধ্যমে কীভাবে করবেন তা জানেন, তবে এটি সরাসরি লেআউট ফাইলে করতে চান (যদিও কারণগুলি ভাল নয় ... আপনি যখন আঁকেন তবে আপনার কাছে সর্বদা একটি ক্রিয়াকলাপ / প্রসঙ্গ উপলব্ধ থাকে পর্দাটি). উত্তরগুলির কোনওটিই অ্যাঙ্কর ট্যাগগুলির প্রভাবগুলিতে ডুব দেয়।
লিলবির্ডি

উত্তর:


481

কেউ যদি এটি সন্ধান করে তবে একটি দুর্দান্ত বিকল্প রয়েছে যা নথিভুক্ত করা হয়নি (ঘন্টাখানেক অনুসন্ধান করার পরে আমি এটিকে ছুঁড়েছি, এবং শেষ পর্যন্ত এটিকে অ্যান্ড্রয়েড এসডিকে নিজেই বাগ তালিকায় খুঁজে পেয়েছি)। আপনি স্ট্রিং.এক্সএমএলে কাঁচা এইচটিএমএল অন্তর্ভুক্ত করতে পারবেন, যতক্ষণ না আপনি এটি মোড়ানো রাখবেন

<![CDATA[ ...raw html... ]]>

উদাহরণ:

<string name="nice_html">
<![CDATA[
<p>This is a html-formatted string with <b>bold</b> and <i>italic</i> text</p>
<p>This is another paragraph of the same string.</p>
]]>
</string>

তারপরে, আপনার কোডে:

TextView foo = (TextView)findViewById(R.id.foo);
foo.setText(Html.fromHtml(getString(R.string.nice_html)));

আইএমএইচও, এটি :-) এর সাথে কাজ করার জন্য প্রশস্ততার নিকারের বেশ কয়েকটি আদেশ is


26
কেবল যোগ করার জন্য, আপনি সিডিএটিএ ব্লকের অভ্যন্তরে অ্যাডোস্ট্রোফ / একক-উদ্ধৃতিগুলিকেও ব্যাকস্ল্যাশ-এড়িয়ে চলতে পারেন, সুতরাং আপনার কাছে অসীম-কুরবানীর <b> <b> & apos; t < / b>
বিটবাং

5
এটি কি এখনও কাজ করে? আমি এটি চেষ্টা করেছি এবং এটি আক্ষরিক <p> এবং </p> প্রদর্শন করে।
পেরি হার্টম্যান

1
@ পেরি হার্টম্যান আপনিও কি Html.fromHtml(getString(R.string.nice_html))কিছুটা করেছেন? :)
async

1
টেক্সটভিউ foo = কোথায় (টেক্সটভিউ) ভিউবিআইআইডি (আর.আইডি.ফু) সন্ধান করে; foo.setText (Html.fromHtml (GetString, (R.string.nice_html))); যেতে হবে?
রুটিআইঙ্গেলস

2
"Html.fromHtml" এড়ানোর কোনও উপায় আছে কি?
অ্যান্ড্রয়েড বিকাশকারী

127

যেহেতু এখানে শীর্ষ উত্তরটি কিছু ভুল (বা কমপক্ষে জটিল) পরামর্শ দিচ্ছে , আমি মনে করি এটি আপডেট করা উচিত, যদিও প্রশ্নটি বেশ পুরানো:

অ্যান্ড্রয়েডে স্ট্রিং সংস্থানগুলি ব্যবহার করার সময়, আপনাকে কেবল getString(...)জাভা কোড থেকে কল করতে হবে বা android:text="@string/..."আপনার লেআউট এক্সএমএল ব্যবহার করতে হবে ।

এমনকি আপনি যদি আপনার স্ট্রিংগুলিতে এইচটিএমএল মার্কআপ ব্যবহার করতে চান তবে আপনাকে খুব বেশি পরিবর্তন করতে হবে না:

আপনার স্ট্রিং সংস্থাগুলিতে আপনার কেবলমাত্র অক্ষরগুলি পালাতে হবে:

  • ডাবল উদ্ধৃতি চিহ্ন: "হয়ে যায়\"
  • একক উদ্ধৃতি চিহ্ন: 'হয়ে যায়\'
  • এম্পারসেন্ড: &হয়ে &#38;বা&amp;

এর অর্থ আপনি ট্যাগগুলি এড়িয়ে চলা ছাড়া আপনার HTML চিহ্ন আপ যুক্ত করতে পারেন :

<string name="my_string"><b>Hello World!</b> This is an example.</string>

তবে, নিশ্চিত হওয়ার জন্য, আপনার কেবল ব্যবহার করা উচিত <b>, <i>এবং <u>সেগুলি ডকুমেন্টেশনে তালিকাবদ্ধ রয়েছে।

আপনি যদি এক্সএমএল থেকে আপনার এইচটিএমএল স্ট্রিং ব্যবহার করতে চান তবে কেবল ব্যবহার চালিয়ে যান android:text="@string/...", এটি দুর্দান্ত কাজ করবে।

পার্থক্যটি হ'ল আপনি যদি জাভা কোড থেকে আপনার এইচটিএমএল স্ট্রিং ব্যবহার করতে চান তবে এখনকার getText(...)পরিবর্তে আপনাকে ব্যবহার করতে হবে getString(...), কারণ পূর্ববর্তী স্টাইলটি রাখে এবং পরবর্তীটি কেবল এটি সরিয়ে ফেলবে।

তার যে হিসাবে হিসাবে সহজ. সিডিটিএ নেই, না Html.fromHtml(...)

আপনি শুধুমাত্র প্রয়োজন হবে Html.fromHtml(...)যদি আপনি করেনি HTML মার্কআপ মধ্যে সঙ্কেতাক্ষরে লিখা আপনার বিশেষ অক্ষর। getString(...)তারপরে এটি ব্যবহার করুন । আপনি যদি স্ট্রিং টু পাস করতে চান তবে এটি প্রয়োজনীয় হতে পারে String.format(...)

এটি সমস্ত ডক্সেও বর্ণিত ।

সম্পাদনা:

getText(...)অনস্কেপড এইচটিএমএল (যেমন আমি প্রস্তাব করেছি) বা CDATAবিভাগ এবং এর মধ্যে কোনও পার্থক্য নেই Html.fromHtml(...)

তুলনার জন্য নিম্নলিখিত গ্রাফিকটি দেখুন:

এখানে চিত্র বর্ণনা লিখুন


খনি এটি সরিয়ে ফেলা হয়। আমি নিম্নলিখিত কোডটি ব্যবহার করছি:getResources().getText(R.string.codename)
Si8

3
আরও সহায়তা করার জন্য, আমার জাভা / এক্সএমএল অংশগুলি দেখতে হবে to কিন্তু আমি লিখিত করেছি: আপনি শুধুমাত্র নিশ্চিত যদি আপনি ব্যবহার করছেন হয় <b>, <i>, <u>। অন্যান্য ট্যাগ সর্বদা সমর্থিত হয় না।
কাও

1
আপনার উত্তর কার্যকর এবং সহজ। পছন্দসই এইচটিএমএল ট্যাগ সহ কেবল স্ট্রিং.এক্সএমএল এ আপনার স্ট্রিংটি রেখে দিন এবং এটি আপনার লেআউট এক্সএমএল ফাইল থেকে উল্লেখ করুন। আমি <আপ> ট্যাগটি ব্যবহার করেছি।
পেরি হার্টম্যান

1
আপনার অন্যটি সমাধান, অন্যটির বিকল্প নয় কারণ এটি অন্যান্য ট্যাগগুলির মতো সমস্ত ট্যাগ সমর্থন করে না। অন্যটি খুব সহজ হলে আমি এই সমাধানটিতে কোনও সুবিধা দেখতে ব্যর্থ হই।
মোবাইলপোটাটো 7

1
আমি যেমন "সিডিএটিএ" ব্যবহার করতে সমস্যা পেয়েছি, উদাহরণস্বরূপ: <! [সিডিএটিএ [... এইচটিএমএল ...]]> এর 22 টি অক্ষর এবং এইচটিএমএল অংশ রয়েছে 10 তাই আপনি যদি HTML.fromhtml ব্যবহার করেন ( gettring (...)) আপনার পাঠ্যটি সঠিকভাবে প্রদর্শিত হবে তবে পাঠ্যের সামগ্রীতে 22 টি অক্ষরের স্পেস দরকার। আমি তালিকাগুলিতে ব্যবহার করেছি এবং আগাছা জায়গা দেখেছি। সুতরাং gettext () ভাল।
ডেভিড

16

আপনার এইচটিএমএল ট্যাগগুলি এড়িয়ে চলুন ...

<resources>
    <string name="somestring">
        &lt;B&gt;Title&lt;/B&gt;&lt;BR/&gt;
        Content
    </string>
</resources>

ডক্স এটিই বলে: ডেভেলপার.অ্যান্ড্রয়েড .com/intl/zh-TW/guide/topics/resources/… তবে TextViewএইচটিএমএল দেখানোর পক্ষে কি যথেষ্ট ?
ম্যাকার্সে

3
আমি এটি পরীক্ষা করেছি এবং আপনি যদি জাভা উত্স কোড থেকে এটি ব্যবহার করেন তবে তা ঠিক আছে। তবে আপনি যদি আপনার টেক্সটটি সরাসরি এক্সএমএল লেআউট থেকে যুক্ত করেন তবে ট্যাগগুলি পাঠ্য দৃশ্যে দেখানো হয় (যেমন <B> শিরোনাম </ b> ...)
জোল্টানএফ

একটি দৃশ্যে পাঠ্যটি দেখানোর জন্য , বিশেষত [ বিকাশকারী.আ্যান্ড্রয়েড .com/references/ android/ text/ Html.html] শ্রেণিটি ব্যবহার করুন fromHTML()
ইকোয়া

@ জোল্টানএফ ঠিক আছে, অ্যান্ড্রয়েড ব্যবহার করে: টেক্সট = "" এইচটিএমএল সহ একটি লেআউট থেকে ট্যাগগুলি স্ট্রিংটিতে প্রদর্শিত হবে।
অ্যান্ড্রু ম্যাকেনিজি

1
আপনি যদি এক্সএমএল থেকে সরাসরি এইচটিএমএল স্ট্রিংটি ব্যবহার করতে চান তবে আপনি স্ট্রিংটিতে এইচটিএমএল বিশেষ অক্ষরগুলি এনকোড করতে পারবেন না । যাইহোক, আপনি কোড থেকে স্ট্রিং ব্যবহার করতে চান মাধ্যমে Html.fromHTML()আপনি আছে বিশেষ অক্ষর সঙ্কেতাক্ষরে লিখা। স্ট্রেঞ্জ!
কাও

11

রিসোর্স স্ট্রিংয়ের ধরণ (উদাহরণস্বরূপ পাঠ্য / প্লেইন বা পাঠ্য / এইচটিএমএল) নির্দেশ করতে অ্যান্ড্রয়েডের কোনও স্পেসিফিকেশন নেই। তবে সেখানে একটি workaround আছে, এটি বিকাশকারীকে এক্সএমএল ফাইলের মধ্যে এটি নির্দিষ্ট করার অনুমতি দেবে।

  1. Android: পাঠ্য বৈশিষ্ট্যটি এইচটিএমএল উল্লেখ করার জন্য একটি কাস্টম বৈশিষ্ট্য নির্ধারণ করুন।
  2. একটি সাবক্ল্যাসড টেক্সটভিউ ব্যবহার করুন।

একবার আপনি এটিকে সংজ্ঞায়িত করার পরে, আপনাকে আর কখনও সেটটেক্সট (Html.fromHtml (...)) কল না করেই এক্সএমএল ফাইলগুলিতে এইচটিএমএল দিয়ে নিজেকে প্রকাশ করতে পারেন। আমি বরং অবাক হয়েছি যে এই পদ্ধতির API এর অংশ নয়।

এই সমাধানটি এমন ডিগ্রিতে কাজ করে যা অ্যান্ড্রয়েড স্টুডিও সিমুলেটর পাঠ্যটিকে রেন্ডার HTML হিসাবে প্রদর্শন করবে।

এখানে চিত্র বর্ণনা লিখুন

রেস / মান / স্ট্রিং.এক্সএমএল (এইচটিএমএল হিসাবে স্ট্রিং রিসোর্স)

<resources>
<string name="app_name">TextViewEx</string>
<string name="string_with_html"><![CDATA[
       <em>Hello</em> <strong>World</strong>!
 ]]></string>
</resources>

বিন্যাস.এক্সএমএল (কেবলমাত্র প্রাসঙ্গিক অংশ)

কাস্টম অ্যাট্রিবিউট নেমস্পেস ঘোষণা করুন এবং android_ex: isHtml অ্যাট্রিবিউট যুক্ত করুন। টেক্সটভিউয়ের সাবক্লাসও ব্যবহার করুন।

<RelativeLayout
...
xmlns:android_ex="http://schemas.android.com/apk/res-auto"
...>

<tv.twelvetone.samples.textviewex.TextViewEx
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/string_with_html"
    android_ex:isHtml="true"
    />
 </RelativeLayout>

res / মান / attrs.xML (সাবক্লাসের জন্য কাস্টম বৈশিষ্ট্যগুলি সংজ্ঞায়িত করুন)

 <resources>
<declare-styleable name="TextViewEx">
    <attr name="isHtml" format="boolean"/>
    <attr name="android:text" />
</declare-styleable>
</resources>

টেক্সটভিউএক্স.জভা (টেক্সটভিউয়ের সাবক্লাস)

 package tv.twelvetone.samples.textviewex;

 import android.content.Context;
 import android.content.res.TypedArray;
 import android.support.annotation.Nullable;
 import android.text.Html;
 import android.util.AttributeSet;
 import android.widget.TextView;

public TextViewEx(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TextViewEx, 0, 0);
    try {
        boolean isHtml = a.getBoolean(R.styleable.TextViewEx_isHtml, false);
        if (isHtml) {
            String text = a.getString(R.styleable.TextViewEx_android_text);
            if (text != null) {
                setText(Html.fromHtml(text));
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        a.recycle();
    }
}
}

এই পদ্ধতিরটি আরও ভাল হবে, যদি অ্যাপ্লিকেশনটি প্রতি জায়গায় HTML.fromHtml কল করার পরিবর্তে একাধিক স্থানে এইচটিএমএল ফর্ম্যাটযুক্ত স্ট্রিং ব্যবহার করে। অ্যাপ্লিকেশনটিতে নিজেই দুটি মতামত থাকবে একটি সাধারণ এবং একটি HTML এর জন্য।
মঞ্জু

10

সর্বশেষ আপডেট:

Html.fromHtml(string);// অ্যান্ড্রয়েড এন সংস্করণ পরে অবচয় করা ..

নিম্নলিখিত কোডটি অ্যান্ড্রয়েড এন এবং উপরের সংস্করণগুলিকে সহায়তা দেয় ...

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
textView.setText(Html.fromHtml(yourHtmlString,Html.FROM_HTML_MODE_LEGACY));
}

else 
{
textView.setText(Html.fromHtml(yourHtmlString));
}

3
  String termsOfCondition="<font color=#cc0029>Terms of Use </font>";
  String commma="<font color=#000000>, </font>";
  String privacyPolicy="<font color=#cc0029>Privacy Policy </font>";
  Spanned text=Html.fromHtml("I am of legal age and I have read, understood, agreed and accepted the "+termsOfCondition+commma+privacyPolicy);
        secondCheckBox.setText(text);

2

সার্ভার থেকে স্ট্রিং এইচটিএমএল পাওয়ার সাথে সাথে আমার যখন সিডিএটিএল xML- এ রাখার সুযোগ নেই তখন আমার আর একটি কেস হয়।

আমি একটি সার্ভার থেকে যা পাই তা এখানে:

<p>The quick brown&nbsp;<br />
fox jumps&nbsp;<br />
 over the lazy dog<br />
</p>

এটি আরও জটিল বলে মনে হচ্ছে তবে সমাধানটি আরও সহজ।

private TextView textView;

protected void onCreate(Bundle savedInstanceState) { 
.....
textView = (TextView) findViewById(R.id.text); //need to define in your layout
String htmlFromServer = getHTMLContentFromAServer(); 
textView.setText(Html.fromHtml(htmlFromServer).toString());

}

আশা করি এটা সাহায্য করবে!
Linh


4
কোথায় এইচটিএমএল কনটেন্টফ্র্যামএএসবার () ফাংশন বাস্তবায়ন হয়
পল্লবী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.