125 votes

HTML dans une ressource de chaîne?

Je sais que je peux mettre échappé balises HTML dans les ressources de chaîne. Cependant, en regardant le code source de l'application Contacts, je peux voir qu'ils ont une façon de ne pas avoir à coder le HTML. Citation partir de l'application Contacts 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>

Malheureusement, lorsque j'essaie quelque chose de semblable (comme Hello, <b>World</b>!), getString() retourne une chaîne de caractères sans les balises (je peux voir que dans logcat). Pourquoi est-ce? Comment puis-je obtenir de la chaîne d'origine, avec les étiquettes et tout? Comment est l'application Contacts de le faire?

212voto

Donn Felker Points 3501

Vous pouvez également entourer votre code HTML dans un bloc CDATA et getString renverra votre code HTML réel. Comme tels:

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

Maintenant, lorsque vous effectuez une opération getString (R.string.foo), la chaîne sera HTML. Si vous devez restituer le code HTML (avec le lien indiqué) via une vue textuelle cliquable, vous devez effectuer un appel Html.fromHtml (...) pour obtenir le texte à convertir.

94voto

Felix Points 33944

Il semble que getString() fait exactement cela - obtient une chaîne . Pour utiliser cela, vous devez utiliser getText() (et pas plus de Html.fromHtml() ), à savoir:

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

Cependant, il semble que la propriété android:text fasse exactement la même chose et que ceci soit équivalent:

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

Et en strings.xml :

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

57voto

user1006786 Points 119

La meilleure solution consiste à utiliser les ressources de la manière suivante:

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

et que l'afficher avec:

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

Essayez d'utiliser cette ressource sans et avec tv.setText (getText (R.string.htmlsource)); et vous verrez la différence.

-1voto

Someone Somewhere Points 8361

Idée: placez le code HTML dans des fichiers au format JSON et stockez-les dans / res / raw. (JSON est moins difficile)

Stockez les enregistrements de données comme celui-ci dans un objet de tableau:

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

Pour lire les données dans votre application:

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

Enfin, la classe Data n'est qu'un conteneur de variables publiques pour un accès facile ...

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X