Android XML procent Symbol

Mam tablicę łańcuchów, w których używany jest symbol %. Prawidłowym formatem użycia % jest %. Gdy mam łańcuch w tablicy z wielokrotnością %, pojawia się ten błąd.

 Multiple annotations found at this
 line:
 - error: Multiple substitutions specified in non-positional format;
   did you mean to add the formatted="false" attribute?
 - error: Found tag </item> where </string-array> is expected
Author: Vadim Kotov, 2010-12-11

14 answers

Narzędzie Android Asset Packaging (aapt) stało się bardzo rygorystyczne w swoim najnowszym wydaniu i jest teraz używane dla wszystkich wersji Androida. Błąd aapt, który otrzymujesz, jest generowany, ponieważ nie pozwala już nie-pozycyjnych specyfikacji formatu.

Oto kilka pomysłów, w jaki sposób można włączyć symbol %do ciągów zasobów.

Jeśli nie potrzebujesz żadnych specyfikacji formatu lub podstawień w łańcuchu, możesz po prostu użyć formatted atrybut i ustaw go na false:

<string formatted="false">%a + %a == 2%a</string>

W tym przypadku łańcuch nie jest używany jako ciąg formatujący dla Formatter więc nie musisz uciekać od swoich % - symboli. Wynikowy ciąg znaków to "%a + %a = = 2% a".

Jeśli pominiesz atrybut formatted="false", łańcuch jest używany jako łańcuch formatujący i musisz uciec od symboli%. Jest to poprawnie zrobione z double -%:

<string>%%a + %%a == 2%%a</string>

Teraz aapt nie daje żadnych błędów, ale w zależności od tego, jak go używasz, wynikowy ciąg może być " % % a + %%a = = 2% % A " if a Formatter jest wywoływane bez argumentów w formacie :

Resources res = context.getResources();

String s1 = res.getString(R.string.str);
// s1 == "%%a + %%a == 2%%a"

String s2 = res.getString(R.string.str, null);
// s2 == "%a + %a == 2%a"

Bez żadnego XML i kodu trudno jest powiedzieć, co dokładnie jest Twój problem, ale mam nadzieję, że to pomoże Ci zrozumieć mechanizmy trochę lepiej.

 480
Author: Josef Pfleger,
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
2010-12-11 15:06:44

Aby zezwolić aplikacji na używanie sformatowanych ciągów z zasobów, należy poprawić swój xml. Na przykład

<string name="app_name">Your App name, ver.%d</string>

Należy zastąpić

<string name="app_name">Your App name, ver.%1$d</string>

Możesz zobaczyć to Po szczegóły.

 158
Author: Paul E.,
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
2011-02-25 06:44:23

Możesz uciec % używając % % dla parsera XML, ale jest to pokazane dwa razy w device.

Aby wyświetlić go raz, spróbuj wykonać następujący format: \%%

Na Przykład

<string name="zone_50">Fat Burning (50\%% to 60\%%)</string> 

Jest pokazywany jako Fat Burning (50% to 60%) w urządzeniu

 81
Author: pavblazek,
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-10-20 13:52:24

Użyj

<string name="win_percentage">%d%% wins</string>

Aby uzyskać

80% wins jako sformatowany ciąg znaków.

Używam metody String.format(), aby wstawić numer zamiast %d.

 38
Author: ViliusK,
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-03-31 16:22:56

W Twoich strunach.plik xml możesz użyć dowolnego znaku Unicode.

Na przykład, liczba Unicode dla znaku procentowego to 0025:

<string name="percent_sign">&#x0025;</string>

Możesz zobaczyć obszerną listę znaków Unicode tutaj

 13
Author: Asaf Pinhassi,
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
2013-04-29 07:24:58

Aby uciec od symbolu procent, wystarczy %%

Na przykład:

String.format("%1$d%%", 10)

Zwraca "10%"

 11
Author: landerlyoung,
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-20 16:41:59

Nie do końca twój problem, ale podobny.

Jeśli masz więcej niż jedno formatowanie w swoim wpisie, nie powinieneś używać "%s" wiele razy.

NIE:

<string name="entry">Planned time %s - %s (%s)</string>

DO:

<string name="entry">Planned time %1$s - %2$s (%3$s)</string>
 7
Author: Garytech,
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-01-03 08:39:18

Trudna metoda: użycie małego znaku procentowego jak poniżej

 <string name="zone_50">Fat Burning (50&#65130; to 60&#65130;)</string> 

Procentowy znak na Wikipedii

 6
Author: Bao Le,
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-05-29 07:40:53

Możesz uciec % w xml za pomocą%%, ale musisz ustawić tekst w kodzie, a nie w layout xml.

 5
Author: Mee,
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
2011-03-15 08:54:36

Może to być przypadek, że IDE staje się zbyt surowe.

Pomysł jest dobry, ogólnie należy określić kolejność zmiennych zastępczych, aby w przypadku dodania zasobów do innego języka kod Javy nie musiał być zmieniany. Istnieją jednak dwa problemy z tym:

Po pierwsze, łańcuch taki jak:

You will need %.5G %s

Do użycia jako będziesz potrzebował 2,1200 mg będzie miał taką samą kolejność w każdym języku, ponieważ ta ilość masy jest zawsze reprezentowana w tym zamów naukowo.

Po drugie, jeśli umieścisz kolejność zmiennych w jakim kiedykolwiek języku domyślne zasoby są określone w (np. angielski), to musisz tylko określić pozycje w ciągach zasobów dla języków, w których używasz innej kolejności niż domyślny język.

Dobrą wiadomością jest to, że jest to proste do naprawienia. Nawet jeśli nie ma potrzeby określania pozycji, a IDE jest zbyt rygorystyczne, po prostu je określ. Dla przykładu powyżej użycie:

Będziesz potrzebował %1$.5G %2$S

 5
Author: Steve Waring,
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
2014-07-28 22:14:24

Spróbuj tego (po prawej):

<string name="content" formatted="false">Great application %s  ☞  %s  ☞  %s \\n\\nGo to download this application %s</string>
 3
Author: sonida,
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
2013-01-04 18:10:09

Według oficjalnej dokumentacji google, użyj %1$s i %2$s http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling{[2]

Witaj, %1$s! Masz %2$D Nowe wiadomości.

 1
Author: techtinkerer,
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
2016-03-11 00:58:21

Załóżmy, że chcesz pokazać (50% taniej) i wprowadzić 50 w czasie wykonywania. Oto kod:

<string name="format_discount"> (
<xliff:g id="discount">%1$s</xliff:g>
<xliff:g id="percentage_sign">%2$s</xliff:g>
 OFF)</string>

W klasie java użyj tego kodu:

String formattedString=String.format(context.getString(R.string.format_discount),discountString,"%");
holder1.mTextViewDiscount.setText(formattedString);
 -2
Author: Harish Rana,
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-02-07 11:21:16

Spróbuj użyć odwrotnego ukośnika przed nim, jak poniżej:

\%
 -16
Author: lolraccoon,
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
2010-12-11 00:19:02