Mam tablicę ciągów, w których %
używany jest symbol. Właściwy format do używania %
to %
. Kiedy mam ciąg w tej tablicy z wielokrotnością %
, daje mi 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
Odpowiedzi:
Android Asset Packaging Tool (
aapt
) stał się bardzo rygorystyczny w najnowszej wersji i jest teraz używany we wszystkich wersjach Androida. Generowany błąd aapt jest generowany, ponieważ nie pozwala już na specyfikatory formatu pozycyjnego .Oto kilka pomysłów, jak włączyć% -symbol do ciągów zasobów.
Jeśli nie potrzebujesz żadnych specyfikatorów formatu ani podstawień w swoim ciągu, możesz po prostu skorzystać z
formatted
atrybutu i ustawić go nafalse
:W takim przypadku ciąg nie jest używany jako ciąg formatujący,
Formatter
więc nie musisz uciekać od% -symbols. Wynikowy ciąg to „% a +% a == 2% a”.Jeśli pominiesz
formatted="false"
atrybut, ciąg zostanie użyty jako ciąg formatujący i musisz uciec od symboli% -symbol. Robi się to poprawnie z podwójnym%:Teraz nie
aapt
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”, jeśli aFormatter
jest wywoływany bez żadnych argumentów formatu :Bez kodu XML i kodu trudno jest powiedzieć, na czym dokładnie polega problem, ale mam nadzieję, że pomoże to nieco lepiej zrozumieć mechanizmy.
źródło
Aby zezwolić aplikacji na używanie sformatowanych ciągów znaków z zasobów, należy poprawić plik XML. Na przykład
należy zastąpić
Widać to na szczegóły.
źródło
%1$s
,%2$s
itpMożesz uciec% używając %% dla parsera XML, ale jest pokazany dwukrotnie w urządzeniu.
Aby wyświetlić go raz, spróbuj użyć następującego formatu:
\%%
Na przykład
jest pokazany jak
Fat Burning (50% to 60%)
w urządzeniuźródło
Posługiwać się
<string name="win_percentage">%d%% wins</string>
dostać
80% wins
jako sformatowany ciąg.Używam
String.format()
metody, aby wstawić numer zamiast%d
.źródło
W pliku strings.xml możesz użyć dowolnego znaku Unicode.
Na przykład numer Unicode dla znaku procentu to 0025:
Pełną listę znaków Unicode można znaleźć tutaj
źródło
%
znak wraca. Obawiam się, że to nie rozwiązuje problemu.aby uciec od symbolu procentu, wystarczy %%
na przykład :
zwraca „10%”
źródło
10%
nie zwraca%10
. FIY: Kiedy używaszString.format
, powinieneś zawsze określać ustawienia regionalne. Możesz być naprawdę zaskoczony, gdy nie umieścisz ustawień regionalnych i nie użyjesz ustawień regionalnych arabskich dla numerów formatów ...Nie do końca twój problem, ale podobny.
Jeśli masz więcej niż jedno formatowanie we wpisie ciągu, nie powinieneś używać „% s” wiele razy.
NIE:
ROBIĆ :
źródło
Możesz uciec% w xml za pomocą %%, ale musisz ustawić tekst w kodzie, a nie w układzie xml.
źródło
Może to być przypadek zbyt ścisłego IDE.
Pomysł jest zdrowy, ogólnie rzecz biorąc, powinieneś określić kolejność zmiennych podstawiania, aby w przypadku dodania zasobów dla innego języka kod Java nie musiał być zmieniany. Istnieją jednak dwa problemy z tym:
Po pierwsze, ciąg taki jak:
do zastosowania, ponieważ będziesz potrzebować 2.1200 mg będzie miał taką samą kolejność w dowolnym języku, ponieważ ta ilość masy jest zawsze naukowo reprezentowana w tej kolejności.
Po drugie, jeśli ustawisz kolejność zmiennych w jakimkolwiek języku, w którym określone są domyślne zasoby (np. Angielski), wystarczy określić pozycje w łańcuchach zasobów dla języków, używając innej kolejności niż domyślny język.
Dobra wiadomość jest taka, że można to łatwo naprawić. Chociaż nie ma potrzeby określania pozycji, a IDE jest zbyt surowe, po prostu określ je. W powyższym przykładzie użyj:
źródło
Podstępna metoda: użycie małego znaku procentu, jak poniżej
Znak procentu na Wikipedii
źródło
Spróbuj tego (po prawej):
źródło
Zgodnie z oficjalną dokumentacją Google użyj% 1 $ s i% 2 $ s http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling
Witaj,% 1 $ s! Masz% 2 $ d nowych wiadomości.
źródło
Załóżmy, że chcesz pokazać (50% TANIEJ) i wpisać 50 w czasie wykonywania. Oto kod:
W klasie java użyj tego kodu:
źródło
Spróbuj użyć ukośnika odwrotnego przed nim, jak poniżej:
źródło