Chciałbym odwoływać się do ciągu z innego ciągu w moim pliku strings.xml, jak poniżej (zwróć uwagę na koniec treści ciągu „message_text”):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="button_text">Add item</string>
<string name="message_text">You don't have any items yet! Add one by pressing the \'@string/button_text\' button.</string>
</resources>
Próbowałem powyższej składni, ale potem tekst wypisuje „@ string / button_text” jako czysty tekst. Nie to, czego chcę. Chciałbym wydrukować tekst wiadomości „Nie masz jeszcze żadnych elementów! Dodaj jeden, naciskając przycisk„ Dodaj element ”.
Czy jest jakiś znany sposób na osiągnięcie tego, czego chcę?
UZASADNIENIE:
Moja aplikacja ma listę elementów, ale gdy ta lista jest pusta, pokazuję tekst „@android: id / empty” TextView. Tekst w tym TextView ma poinformować użytkownika, jak dodać nowy element. Chciałbym, aby mój układ był odporny na zmiany (tak, jestem głupcem, o którym mowa :-)
Odpowiedzi:
Dobry sposób na wstawienie często używanego ciągu (np. Nazwy aplikacji) do pliku xml bez użycia kodu Java: source
AKTUALIZACJA:
Możesz nawet zdefiniować swoją jednostkę globalnie, np .:
res / raw / entity.ent:
res / wartości / string.xml:
źródło
Można się do siebie odwoływać, o ile cały łańcuch składa się z nazwy odwołania. Na przykład to zadziała:
Jest to nawet bardziej przydatne do ustawiania wartości domyślnych:
Teraz możesz używać
string_default
wszędzie w swoim kodzie i możesz łatwo zmienić domyślną w dowolnym momencie.źródło
Myślę, że nie możesz. Ale możesz „sformatować” ciąg, jak chcesz:
W kodzie:
źródło
String text = res.getString(R.string.message_text, res.getString(R.string.button_text));
jest trochę czystszy.W Androidzie nie można łączyć napisów wewnątrz xml
Następujące nie jest obsługiwane
Sprawdź poniższy link, aby dowiedzieć się, jak to osiągnąć
Jak połączyć wiele ciągów w Androidzie XML?
źródło
Stworzyłem prostą wtyczkę gradle która pozwala odsyłać jeden ciąg znaków do drugiego. Możesz odwoływać się do łańcuchów zdefiniowanych w innym pliku, na przykład w innym wariancie kompilacji lub bibliotece. Wady tego podejścia - refaktor IDE nie znajdzie takich referencji.
Użyj
{{string_name}}
składni, aby odnieść się do ciągu:Aby zintegrować wtyczkę, po prostu dodaj następny kod do aplikacji lub
build.gradle
pliku na poziomie modułu bibliotekiAKTUALIZACJA: Biblioteka nie działa z wtyczką stopniową Androida w wersji 3.0 i wyższej, ponieważ nowa wersja wtyczki używa aapt2, który pakuje zasoby do formatu binarnego .flat, więc spakowane zasoby są niedostępne dla biblioteki. Jako tymczasowe rozwiązanie możesz wyłączyć aapt2, ustawiając android.enableAapt2 = false w pliku gradle.properties.
źródło
> Could not get unknown property 'referencedString'
Możesz użyć własnej logiki, która rekurencyjnie rozwiązuje zagnieżdżone ciągi.
Na
Activity
przykład nazwij to takźródło
Wiem, że jest to starszy post, ale chciałem podzielić się szybkim i brudnym rozwiązaniem, które wymyśliłem dla mojego projektu. Działa tylko w przypadku TextView, ale można go również dostosować do innych widżetów. Pamiętaj, że wymaga to umieszczenia łącza w nawiasach kwadratowych (np
[@string/foo]
.).Minusem tego podejścia jest to, że
setText()
konwertuje toCharSequence
na aString
, co jest problemem, jeśli zdasz takie rzeczySpannableString
; w moim projekcie nie był to problem, ponieważ użyłem go tylko doTextViews
tego, że nie musiałem uzyskiwać dostępu z mojegoActivity
.źródło
Dzięki nowemu powiązaniu danych możesz łączyć i robić znacznie więcej w swoim pliku XML.
na przykład jeśli masz wiadomość 1 i wiadomość 2, możesz:
możesz nawet zaimportować niektóre narzędzia tekstowe i wywołać String.format i znajomych.
niestety, jeśli chcesz ponownie użyć go w kilku miejscach, może się bałaganić, nie chcesz wszędzie tego fragmentu kodu. i nie można ich zdefiniować w xml w jednym miejscu (nie wiem o tym), dlatego możesz stworzyć klasę, która będzie zawierać te kompozycje:
wtedy możesz go użyć (musisz zaimportować klasę z powiązaniem danych)
źródło
Oprócz powyższej odpowiedzi Francesco Laurita https://stackoverflow.com/a/39870268/9400836
Wygląda na to, że wystąpił błąd kompilacji „i encja; została przywołana, ale nie zadeklarowana”, którą można rozwiązać, odwołując się do zewnętrznej deklaracji w ten sposób
res / raw / entity.ent
res / wartości / strings.xml
Chociaż kompiluje się i uruchamia, ma pustą wartość. Może ktoś wie, jak to rozwiązać. Chciałbym napisać komentarz, ale minimalna reputacja to 50.
źródło
Można użyć symboli zastępczych ciągów (% s) i zastąpić je przy użyciu języka Java w czasie wykonywania
i w java
a następnie ustaw go w miejscu, w którym używa łańcucha
źródło
%1$s
,%2$s
itd zamiast%s
.Stworzyłem małą bibliotekę, która pozwala na rozwiązywanie tych symboli zastępczych podczas kompilacji, więc nie będziesz musiał dodawać żadnego kodu Java / Kotlin, aby osiągnąć to, co chcesz.
W oparciu o twój przykład będziesz musiał skonfigurować swoje ciągi w następujący sposób:
A następnie wtyczka zajmie się generowaniem następujących elementów:
Działa również w przypadku ciągów zlokalizowanych i smakowych, również wygenerowane ciągi będą się aktualizować za każdym razem, gdy wprowadzisz zmiany w szablonach lub ich wartościach.
Więcej informacji tutaj: https://github.com/LikeTheSalad/android-string-reference
źródło