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
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.
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$
, i3$
. 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ć
-
String.format()
będzie również formatować a Sznurek. - terminy
1$
i2$
nie muszą być używane w tej kolejności. Oznacza to, że2$
może być przed1$
. 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
getString
, ponieważ byłem na zajęciach. Możesz użyć context.getResources().getString(...)
, Jeśli nie jest on dostępny.
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.
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. :)
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".
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)
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
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.
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);
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