Dize kaynağında HTML?


120

Dize kaynaklarına kaçan HTML etiketleri koyabileceğimi biliyorum. Bununla birlikte, Kişiler uygulamasının kaynak koduna baktığımda, HTML'yi kodlamak zorunda olmadıklarını görebiliyorum. Kişiler uygulaması strings.xml'den alıntı yapın :

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

Ne yazık ki, benzer bir şey denediğimde (gibi Hello, <b>World</b>!), getString()dizeyi etiketler olmadan döndürüyor (bunu içinde görebiliyorum logcat). Neden? Orijinal dizeyi etiketler ve her şeyle nasıl elde edebilirim? Kişiler uygulaması bunu nasıl yapıyor?

Yanıtlar:


199

Ayrıca html'nizi bir CDATAblok içinde çevreleyebilir ve getString()gerçek HTML'nizi döndürebilirsiniz. Gibi:

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

Şimdi bir getString(R.string.foo)gerçekleştirdiğinizde dize HTML olacaktır. HTML'yi (gösterilen bağlantıyla) tıklanabilir TextViewbir şekilde Html.fromHtml(...)oluşturmanız gerekiyorsa, yayılabilir metni almak için bir arama yapmanız gerekir .


1
Hayır, Felix'in cevabını kesinlikle görmelisiniz. CDATA gerekli değildir.
2013 2

4
@MarcoW. Felix'in cevabı doğrudur ancak CDATA kullanmak html etiketleri konusunda endişelenmememize yardımcı olur. Bu cevap doğru cevap olmalıdır.
slhddn

3
Dizede bağlantılarınız varsa, textView.setMovementMethod (LinkMovementMethod.getInstance ()) eklemeyi unutmayın;
Adarsh ​​Urs

1
Yine \"de stylemülk için kullanmak zorunda kaldım . Örnek<a style=\"...\">link</a>
Fabricio

1
CDATA, dizeleri HTML etiketleriyle şekillendirirken çok daha fazla esneklik sağlar. % 100 gitmenin yolunun bu olduğuna katılıyorum!
Droid Chris

89

Görünüşe göre getString()sadece - bir dizge alıyor . Bunu kullanmak için, kullanmanız gerekir getText()(daha fazla değil Html.fromHtml()), yani:

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

Bununla birlikte, android:textmülk sadece aynı şeyi yapıyor gibi görünüyor ve aşağıdaki eşdeğerdir:

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

Ve içinde strings.xml:

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

28
Lütfen yalnızca desteklenen etiketlerin <b>, <i>, <u> olduğunu unutmayın: developer.android.com/guide/topics/resources/…
Snicolas

2
@pawegio kesinlikle demek istiyorsun \n?
Felix

7
@Snicolas: dokümantasyonda belirtilen 3 etiketten fazlasını destekliyor: <b>, <i>, <u>, <big>, <small>, <sup>, <sub>, <strike>, <li> <çadır>, <a> <font> ve <açıklama> (bkz github.com/android/platform_frameworks_base/blob/... )
RVE

1
Ne yazık ki bu yöntemi kullanırken, dizedeki değişkenlere izin verilmez
Alessandro Muzzi

1
<font> api23'te desteklenir, ancak api10 desteklenmez.
illusionJJ

54

En iyi çözüm, kaynakları bir şekilde kullanmaktır:

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

ve daha sonra şununla göster:

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

Bu kaynağı onsuz <![CDATA[ ]]>ve onsuz kullanmaya çalışın tv.setText(getText(R.string.htmlsource));, farkı göreceksiniz.


Bu cevap için teşekkür ederim bu bana gerçekten yardımcı oldu
Alsemany

Çok büyük ve karmaşık bir HTML dosyasıyla bile mi?
Supuhstar

Bu <font> etiketini destekliyor mu?
Rohit Singh

1

Bunun eski bir soru olduğunu biliyorum ama görünen o ki en etkili cevap henüz önerilmemiştir.

Sadece HTML-escapedkarakterleri kullanın, böylece işlenmez, getStringancak tarafından işlenecektir HtmlCompact.fromHtml(veya daha eskiHtml.fromHtml ) .

Bu, yalnızca getStringyöntem gibi biçimlendirmeyi değil, HTML bağlantıları gibi daha fazla etiketi de destekler .

Örneğin böyle bir şey çalışmalıdır:

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

Durumda da yerini <ile &lt;böyle:

<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

benim için CDATA bloğu olmadan çalışıyor.

<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`

Düzende kullanıyorum.

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

-1

Fikir: HTML'yi JSON biçimli dosyalara koyun ve / res / raw dizininde saklayın. (JSON daha az seçici)

Veri kayıtlarını şu şekilde bir dizi nesnesinde saklayın:

[
    {
        "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
    }
]

Uygulamanızdaki verileri okumak için:

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

Son olarak, Datasınıf, kolay erişim için yalnızca genel değişkenlerin bir kapsayıcısıdır ...

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

Biraz fazla tasarlanmış görünüyor, neden json yerine html olarak kaydetmiyorsunuz?
Misca
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.