এইচটিএমএল স্ট্রিং রিসোর্সে?


120

আমি জানি আমি পালিত এইচটিএমএল ট্যাগগুলিকে স্ট্রিং রিসোর্সে রাখতে পারি। তবে যোগাযোগের অ্যাপ্লিকেশনটির উত্স কোডটি দেখে আমি দেখতে পাচ্ছি যে তাদের এইচটিএমএল এনকোড না করার উপায় রয়েছে। যোগাযোগ অ্যাপ্লিকেশন স্ট্রিং.এক্সএমএল থেকে উদ্ধৃতি :

<string name="contactsSyncPlug"><font fgcolor="#ffffffff">Sync your Google contacts!</font> 
\nAfter syncing to your phone, your contacts will be available to you wherever you go.</string>

দুর্ভাগ্যক্রমে, যখন আমি অনুরূপ কিছু (যেমন Hello, <b>World</b>!) চেষ্টা করি , getString()ট্যাগ ছাড়াই স্ট্রিংটি ফেরত দেয় (আমি এটি দেখতে পারি logcat)। কেন এমন? আমি ট্যাগ এবং সমস্ত কিছু সহ কীভাবে আসল স্ট্রিং পেতে পারি? পরিচিতি অ্যাপ্লিকেশন কীভাবে এটি করছে?

উত্তর:


199

আপনি কোনও CDATAব্লকে আপনার এইচটিএমএলকেও ঘিরে রাখতে পারেন এবং getString()আপনার আসল এইচটিএমএল ফিরিয়ে দেবেন। যেমন:

<string name="foo"><![CDATA[Foo Bar <a href="foo?id=%s">baz</a> is cool]]></string>

এখন আপনি যখন getString(R.string.foo)স্ট্রিং করবেন তখন এইচটিএমএল হবে। আপনি যদি ক্লিকযোগ্যের মাধ্যমে এইচটিএমএলকে (প্রদর্শিত লিঙ্কটি সহ) রেন্ডার TextViewকরতে চান Html.fromHtml(...)তবে আপনাকে স্প্যানিয়েবল পাঠ্য পেতে একটি কল করতে হবে।


1
না, আপনার অবশ্যই ফেলিক্সের উত্তরটি দেখতে হবে। সিডিএটিএ প্রয়োজন হয় না।
কাও

4
@MarcoW। ফেলিক্সের উত্তরটি সত্য তবে সিডিএটিএ ব্যবহার করা আমাদের এইচটিএমএল ট্যাগ সম্পর্কে চিন্তা না করতে সহায়তা করে। এই উত্তরটি সঠিক উত্তর হওয়া উচিত।
slhddn

3
স্ট্রিংয়ে আপনার লিঙ্কগুলি থাকলে, টেক্সটভিউ.সেটমোভমেন্টমেথোদ (লিংকমোভমেন্টমেথড.জেটইনস্ট্যান্স ()) যুক্ত করতে ভুলবেন না;
আদর্শ উরস

1
আমি ব্যবহার করতে হয়েছে \"জন্য styleযদিও, সম্পত্তি। উদাহরণ<a style=\"...\">link</a>
ফ্যাব্রিকিও

1
এইচটিএমএল ট্যাগ সহ স্ট্রিং স্টাইল করার সময় সিডিএটিএ আপনাকে অনেক বেশি নমনীয়তা দেয়। আমি একমত হতে চাই যে 100% যাওয়ার উপায়!
ড্রড ক্রিস

89

মনে getString()হচ্ছে এটি ঠিক তা করে - একটি স্ট্রিং পায় । এটি ব্যবহার করতে, আপনাকে ব্যবহার করতে হবে getText()(এবং আরও কিছু নয় Html.fromHtml()):

mTextView.setText(getText(R.string.my_styled_text));

তবে, মনে হচ্ছে android:textসম্পত্তিটি ঠিক একই কাজ করে এবং নিম্নলিখিতটি সমতুল্য:

<TextView android:text="@string/my_styled_text" />

এবং এর মধ্যে strings.xml:

<string name="my_styled_text">Hello, <b>World</b>!</string>

28
দয়া করে মনে রাখবেন যে কেবলমাত্র সমর্থিত ট্যাগগুলি
হ'ল

2
@ পাওয়েজিও নিশ্চয়ই আপনার মানে \n?
ফেলিক্স

7
@ স্নিকোলস: এটি ডকুমেন্টেশনে উল্লিখিত 3 টি ট্যাগের চেয়ে বেশি সমর্থন করে: এটি <b>, <i>, <u>, <বিগ>, <এসমল>, <সুপ>, <সাব>, <স্ট্রাইক>, <li>, <মার্কি>, <a>, <ফন্ট> এবং < নোটেশন > ( github.com/android/platform_frameworks_base/blob/… দেখুন )

1
দুর্ভাগ্যক্রমে এই পদ্ধতিটি ব্যবহার করে, স্ট্রিংয়ে ভেরিয়েবলগুলি অনুমোদিত নয়
আলেসান্দ্রো মুজ্জি

1
<font> api23 এ সমর্থিত, তবে api10 নয় is
মায়া

54

কোনও উপায়ে রিসোর্স ব্যবহার করা সবচেয়ে ভাল সমাধান:

<string name="htmlsource"><![CDATA[<p>Adults are spotted gold and black on the crown, back and wings. Their face and neck are black with a white border; they have a black breast and a dark rump. The legs are black.</p><p>It is similar to two other golden plovers, Eurasian and Pacific. <h1>The American Golden Plover</h1> is smaller, slimmer and relatively longer-legged than Eurasian Golden Plover (<i>Pluvialis apricaria</i>) which also has white axillary (armpit) feathers. It is more similar to Pacific Golden Plover (<i>Pluvialis fulva</i>) with which it was once <b>considered</b> conspecific under the name \"Lesser Golden Plover\". The Pacific Golden Plover is slimmer than the American species, has a shorter primary projection, and longer legs, and is usually yellower on the back.</p><p>These birds forage for food on tundra, fields, beaches and tidal flats, usually by sight. They eat insects and crustaceans, also berries.</p>]]></string>

এবং এটির সাথে এটি প্রদর্শন করার চেয়ে:

Spanned sp = Html.fromHtml( getString(R.string.htmlsource));
tv.setText(sp);

ছাড়াও <![CDATA[ ]]>এবং সেই সংস্থানটি ব্যবহার করার চেষ্টা করুন tv.setText(getText(R.string.htmlsource));এবং আপনি পার্থক্যটি দেখতে পাবেন।


এই উত্তরটির জন্য আপনাকে ধন্যবাদ যা সত্যই আমাকে সাহায্য করেছে
Alsemany

এমনকি একটি খুব বড় এবং জটিল এইচটিএমএল ফাইল আছে?
সুপুস্তর

এই <font> ট্যাগ সমর্থন করে?
রোহিত সিং

1

আমি জানি এটি একটি পুরানো প্রশ্ন তবে মনে হয় সর্বাধিক দক্ষ উত্তরটি এখনও প্রস্তাব করা হয়নি।

কেবল HTML-escapedঅক্ষরগুলি ব্যবহার করুন যাতে এটি দ্বারা প্রক্রিয়াজাত করা যায় না getStringতবে এটি HtmlCompact.fromHtml(বা আরও পুরানো Html.fromHtml) দ্বারা প্রক্রিয়া করা হবে ।

এটি এইচটিএমএল লিঙ্ক ইত্যাদির মতো আরও ট্যাগগুলিকে সমর্থন করে, কেবল getStringমেথডের মতো বিন্যাস নয় ।

উদাহরণস্বরূপ, এর মতো কিছু কাজ করা উচিত:

<string name="html_message">Hello &lt;b>World&lt;/b>.</string>

val text = getString(R.string.html_message)
val result = HtmlCompact.fromHtml(text, HtmlCompat.FROM_HTML_MODE_LEGACY)

আপনার যদি আপনি প্রতিস্থাপন <সঙ্গে &lt;ভালো:

<string name="contactsSyncPlug">&lt;font fgcolor="#ffffffff">Sync your Google contacts!&lt;/font> \nAfter syncing to your phone, your contacts will be available to you wherever you go.</string>

0

এটি সিডিটিএ ব্লক ছাড়াই আমার পক্ষে কাজ করে।

<string name="menu_item_purchase" translatable="false"><font color="red">P</font><font color="orange">r</font><font color="yellow">e</font><font color="green">m</font><font color="white">i</font><font color="blue">u</font><font color="purple">m</font></string>`enter code here`

আমি এটি বিন্যাসে ব্যবহার করি।

<item
    android:id="@+id/nav_premium"
    android:icon="@drawable/coins"
    android:title="@string/menu_item_purchase"
    />

-1

আইডিয়া: জেএসওএন-ফর্ম্যাট করা ফাইলগুলিতে এইচটিএমএল রাখুন এবং এগুলিকে / রেজো / কাঁচা সংরক্ষণ করুন। (জেএসএন কম বাছাই করা)

অ্যারে অবজেক্টে এর মতো ডেটা রেকর্ড সংরক্ষণ করুন:

[
    {
        "Field1": "String data",
        "Field2": 12345,
        "Field3": "more Strings",
        "Field4": true
    },
    {
        "Field1": "String data",
        "Field2": 12345,
        "Field3": "more Strings",
        "Field4": true
    },
    {
        "Field1": "String data",
        "Field2": 12345,
        "Field3": "more Strings",
        "Field4": true
    }
]

আপনার অ্যাপ্লিকেশন ডেটা পড়তে:

private ArrayList<Data> getData(String filename) {
    ArrayList<Data> dataArray = new ArrayList<Data>();

    try {
        int id = getResources().getIdentifier(filename, "raw", getPackageName());
        InputStream input = getResources().openRawResource(id);
        int size = input.available();
        byte[] buffer = new byte[size];
        input.read(buffer);
        String text = new String(buffer);

        Gson gson = new Gson();
        Type dataType = new TypeToken<List<Map<String, Object>>>() {}.getType();
        List<Map<String, Object>> natural = gson.fromJson(text, dataType);

        // now cycle through each object and gather the data from each field
        for(Map<String, Object> json : natural) {
            final Data ad = new Data(json.get("Field1"), json.get("Field2"),  json.get("Field3"), json.get("Field4"));
            dataArray.add(ad);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return dataArray;
}

শেষ অবধি, Dataক্লাসটি সহজে অ্যাক্সেসের জন্য সর্বজনীন পরিবর্তনশীলগুলির একটি ধারক ...

public class Data {

    public String string;
    public Integer number;
    public String somestring;
    public Integer site;
    public boolean logical;


    public Data(String string, Integer number, String somestring, boolean logical)
    {
        this.string = string;
        this.number = number;
        this.somestring = somestring;
        this.logical = logical;
    }
}

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