dynamiczny ciąg za pomocą String.xml?

Czy możliwe jest umieszczenie symboli zastępczych w wartościach łańcuchowych w string.xml, które można przypisać wartości w czasie wykonywania?

Przykład:

Some string PLACEHOLDER1 some more string

Author: Rahul Tiwari, 2010-09-07

9 answers

Formatowanie i stylizacja

Tak, zobacz następujące zasoby z String: formatowanie i stylizacja

Jeśli chcesz sformatować swoje ciągi za pomocą String.format(String, Object...), możesz to zrobić, umieszczając argumenty formatu w zasobie ciągów. Na przykład z następującym zasobem:

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

W tym przykładzie łańcuch formatu ma dwa argumenty: {[6] } jest łańcuchem znaków, a {[7] } jest liczbą dziesiętną. Możesz sformatować łańcuch z argumentami z twojego zastosowanie jak to:

Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);

Podstawowe Użycie

Zauważ, że getString ma przeciążenie, które wykorzystuje ciąg znaków jako ciąg formatujący:

String text = res.getString(R.string.welcome_messages, username, mailCount);

Liczba mnoga

Jeśli potrzebujesz obsługiwać liczby mnogie, użyj tego:

<plurals name="welcome_messages">
    <item quantity="one">Hello, %1$s! You have a new message.</item>
    <item quantity="other">Hello, %1$s! You have %2$d new messages.</item>
</plurals>

Pierwszy mailCount param jest używany do decydowania, jakiego formatu użyć( pojedynczego lub mnogiego), Pozostałe paramy są twoimi substytucjami:

Resources res = getResources();
String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount);

Zobacz String Resources: liczba mnoga aby uzyskać więcej szczegółów.

 794
Author: Megha Joshi - GoogleTV DevRel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-18 03:46:04

Odpowiedź Uzupełniająca

Kiedy po raz pierwszy zobaczyłem %1$s i %2$d w zaakceptowanej odpowiedzi, nie miało to sensu. Tutaj jest trochę więcej wyjaśnienia.

Nazywane są specyfikatorami formatów. W łańcuchu xml mają one postać

%[parameter_index$][format_type] 
  • %: znak procent oznacza początek specyfikacji formatu.
  • parametr index : jest to liczba, po której następuje znak dolara. Jeśli masz trzy parametry, które chcesz wstawić do string, wtedy będą one nazywane 1$, 2$, i 3$. Kolejność umieszczania ich w łańcuchu zasobów nie ma znaczenia, tylko kolejność podawania parametrów.
  • Typ formatu: istnieje wiele sposobów formatowania rzeczy (zobacz dokumentację). Oto kilka typowych:

    • s string
    • d liczba dziesiętna
    • f zmiennoprzecinkowy liczba

Przykład

Utworzymy następujący sformatowany ciąg znaków, w którym szare części są wstawiane programowo.

Moja siostra ma 12 lat.

sznurek.xml

<string name="my_xml_string">My sister %1$s is %2$d years old.</string>

Moja aktywność.java

String myString = "Mary";
int myInt = 12;
String formatted = getString(R.string.my_xml_string, myString, myInt);

Uwagi

    Mógłbym użyć getString, ponieważ byłem na zajęciach. Możesz użyć context.getResources().getString(...), Jeśli nie jest on dostępny.
  • String.format() będzie również formatować a Sznurek.
  • terminy 1$ i 2$ nie muszą być używane w tej kolejności. Oznacza to, że 2$ może być przed 1$. Jest to przydatne podczas internacjonalizacji aplikacji dla języków, które używają innej kolejności słów.
  • możesz użyć specyfikatora formatu, takiego jak %1$s wiele razy w xml, jeśli chcesz go powtórzyć.
  • Użyj %%, aby uzyskać rzeczywisty znak %.
  • Aby uzyskać więcej informacji, przeczytaj poniższy pomocny samouczek: Android SDK Quick Tip: formatowanie Ciągi Zasobów
 167
Author: Suragch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-11 04:30:33

Gdy chcesz użyć parametru z rzeczywistych łańcuchów.plik xml bez użycia kodu Javy:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
  <!ENTITY appname "WhereDat">
  <!ENTITY author "Oded">
]>

<resources>
    <string name="app_name">&appname;</string>
    <string name="description">The &appname; app was created by &author;</string>
</resources>

To nie działa między plikami zasobów, tzn. zmienne muszą być skopiowane do każdego pliku XML, który ich potrzebuje.

 107
Author: WhereDatApp.com,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-22 15:58:05

Szukał tego samego i w końcu znalazł następujące bardzo proste rozwiązanie. Najlepsze: działa po wyjęciu z pudełka.
1. Zmień swój ciąg ressource:

<string name="welcome_messages">Hello, <xliff:g name="name">%s</xliff:g>! You have 
<xliff:g name="count">%d</xliff:g> new messages.</string>

2. use string substitution:

c.getString(R.string.welcome_messages,name,count);

Gdzie c jest kontekstem, name jest zmienną łańcuchową i count twoja zmienna int

Musisz dołączyć

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

W Twoim res / strings.xml. Mi pasuje. :)

 15
Author: user3016503,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-05 13:16:46

Należy jednak również przeczytać ODPOWIEDŹ Eliasa Mårtensona na temat leczenia liczby mnogiej Androida "zero" . Istnieje problem z interpretacją pewnych wartości, takich jak "zero".

 2
Author: JJD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:45

Kotlin wersja zaakceptowanej odpowiedzi...

val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)
 0
Author: jesses.co.tt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-21 06:03:37

Możesz użyć MessageFormat

<string name="customer_address">Wellcome: {0} {1}</string>

W kodzie Javy:

String text =MessageFormat(R.string.customer_address).format("Name","Family");

API poziom 1:

Https://developer.android.com/reference/java/text/MessageFormat.html

 0
Author: Ahmad Aghazadeh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-02 18:16:19

W Kotlinie musisz tylko ustawić wartość string w następujący sposób:

<string name="song_number_and_title">"%1$d ~ %2$s"</string>

Utwórz widok tekstowy na układzie:

<TextView android:id="@+id/song_number_and_title"/>

Następnie zrób to w kodzie, jeśli używasz Anko:

val song = database.use { // get your song from the database }
song_number_and_title.setText(resources.getString(R.string.song_number_and_title, song.number, song.title))  

Może być konieczne pobranie zasobów z kontekstu aplikacji.

 0
Author: msbodw001,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-10 19:17:58

W res / values / string.xml

<resources>
    <string name="app_name">Hello World</string>
    <string name="my_application">Application name: %s, package name: %s</string>
</resources>

W kodzie java

String[] args = new String[2];
args[0] = context.getString(R.string.app_name);
args[1] = context.getPackageName();
String textMessage = context.getString(R.string.my_application,(Object[]) args);
 0
Author: Chanh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-17 08:12:37