HTML в строковом ресурсе? - PullRequest
       7

HTML в строковом ресурсе?

107 голосов
/ 19 апреля 2010

Я знаю, что могу поместить экранированные теги HTML в строковые ресурсы. Однако, глядя на исходный код приложения «Контакты», я вижу, что у них есть способ не кодировать HTML. Цитата из приложения «Контакты» strings.xml :

<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). Это почему? Как я могу получить оригинальную строку, с тегами и всем? Как приложение «Контакты» делает это?

Ответы [ 5 ]

174 голосов
/ 04 октября 2011

Вы также можете заключить ваш html в блок CDATA, и getString вернет ваш фактический HTML. Вроде таких:

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

Теперь, когда вы выполните getString (R.string.foo), строка будет HTML. Если вам нужно отобразить HTML-код (со ссылкой, как показано) с помощью интерактивного TextView, вам нужно выполнить вызов Html.fromHtml (...), чтобы получить включаемый текст.

84 голосов
/ 19 апреля 2010

Кажется, 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>
48 голосов
/ 09 ноября 2011

Лучшее решение - использовать ресурсы таким образом:

<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);

Попробуйте использовать этот ресурс без и с tv.setText (getText (R.string.htmlsource)); и вы увидите разницу.

0 голосов
/ 03 октября 2017

у меня работает без блока CDATA.

<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"
    />
0 голосов
/ 23 января 2014

Идея: поместить HTML в файлы в формате JSON и сохранить их в / res / raw. (JSON менее требователен)

Сохраните записи данных следующим образом в массиве:

[
    {
        "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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...