Chciałbym mieć 2 języki dla interfejsu użytkownika i osobne wartości dla nich w moim pliku zasobów res\values\strings.xml
:
<string name="tab_Books_en">Books</string>
<string name="tab_Quotes_en">Quotes</string>
<string name="tab_Questions_en">Questions</string>
<string name="tab_Notes_en">Notes</string>
<string name="tab_Bookmarks_en">Bookmarks</string>
<string name="tab_Books_ru">Книги</string>
<string name="tab_Quotes_ru">Цитаты</string>
<string name="tab_Questions_ru">Вопросы</string>
<string name="tab_Notes_ru">Заметки</string>
<string name="tab_Bookmarks_ru">Закладки</string>
Teraz muszę dynamicznie pobierać te wartości w mojej aplikacji:
spec.setContent(R.id.tabPage1);
String pack = getPackageName();
String id = "tab_Books_" + Central.lang;
int i = Central.Res.getIdentifier(id, "string", pack);
String str = Central.Res.getString(i);
Mój problem jest taki i = 0
.
Dlaczego w moim przypadku to nie działa?
en
alboru
?Odpowiedzi:
Odnośnik, do którego się odwołujesz, wydaje się działać z ciągami generowanymi w czasie wykonywania. Ciągi z pliku strings.xml nie są tworzone w czasie wykonywania. Możesz je zdobyć za pośrednictwem
getResources()
jest metodąContext
klasy. Jeśli znajdujesz się w aActivity
lubService
(który rozszerza kontekst), możesz użyć go tak jak w tym fragmencie.Należy również pamiętać, że cała zależność językowa może być rozwiązana przez platformę Android . Po prostu utwórz różne foldery dla każdego języka. Jeśli angielski jest Twoim domyślnym językiem, po prostu wstaw ciągi angielskie
res/values/strings.xml
. Następnie utwórz nowy foldervalues-ru
i umieść w nim rosyjskie łańcuchy o identycznych nazwachres/values-ru/strings.xml
. Od tego momentu Android wybiera właściwy dla Ciebie, w zależności od ustawień regionalnych urządzenia, zarówno podczas połączenia, jakgetString()
i podczas odwoływania się do ciągów znaków w języku XML za pośrednictwem@string/mystring
. Te zres/values/strings.xml
są rezerwowe, jeśli nie masz folderu obejmującego ustawienia narodowe użytkowników, ten zostanie użyty jako wartości domyślne.Aby uzyskać więcej informacji, zobacz Lokalizacja i udostępnianie zasobów .
źródło
android.support.v4.app.Fragment
, możesz po prostu zadzwonićgetString(R.string.mystring)
bezpośrednio.Mam ten sam problem. Ale poniższy kod działa dla mnie: Sprawdź, czy nazwa pakietu jest poprawna. Musisz odszukać pakiet główny aplikacji na Androida.
źródło
string
a niestrings
. Ponieważ jest to logiczne (podobnie jak reszta Androida). Dziękuję za to (i więcej), @leonvian. :-)String someStringFromXML = getString(getResources().getIdentifier("some_string_name", "string", getPackageName()));
.Nie tylko z działań:
źródło
źródło
Dodałbym coś do rozwiązania leonvian, więc jeśli przypadkiem łańcuch nie zostanie znaleziony wśród zasobów (zwróci wartość 0, to nie jest prawidłowy kod zasobu), funkcja może coś zwrócić:
źródło
Najlepsze podejście
App.getRes().getString(R.string.some_id)
Działa wszędzie (Utils, Modele również).
Przeczytałem wszystkie odpowiedzi, wszystkie odpowiedzi mogą zrobić twoją pracę.
getString(R.string.some_string_id)
w obuActivity
lubFragment
.Context.getString(R.string.some_string_id)
, gdy nie masz bezpośredniego dostępu dogetString()
metody. JakDialog
.Problem
Kiedy nie masz
Context
dostępu , jak metoda w swojejUtil
klasie.Załóżmy poniższą metodę bez kontekstu.
Teraz przejdziesz
Context
jako parametr w tej metodzie i użyjeszgetString().
To co robię jest
Co? Jest bardzo prosty w użyciu w dowolnym miejscu w aplikacji!
Oto rozwiązanie, dzięki któremu możesz uzyskać dostęp do zasobów z dowolnego miejsca
Util class
.Dodaj pole nazwy do
manifest.xml
<application
tagu.Teraz możesz już iść. Używaj w
App.getAppResources().getString(R.string.some_id)
dowolnym miejscu aplikacji.źródło
getResourses
,getResources
spowoduje to zastąpienie. Również wzór singletonu wydaje się niepotrzebny, być może można go pominąć. Jakieś problemy z wyciekiem pamięci w tym rozwiązaniu?Łatwiejszym sposobem jest użycie
getString()
funkcji w ramach działania.Odniesienie: http://developer.android.com/guide/topics/resources/string-resource.html
Myślę, że ta funkcja została dodana w najnowszej wersji Androida, każdy, kto zna historię, może komentować.
źródło
Prosty sposób na przeniesienie łańcucha zasobów z łańcucha do TextView. Tutaj nazwa_zasobu to nazwa zasobu
źródło
Jeśli nie masz odwołania do działania, możesz użyć swojego kontekstu w następujący sposób:
źródło
Istnieje również zestaw predefiniowanych ciągów Androida, takich jak „Ok”, „Anuluj” i wiele innych - więc nie musisz deklarować wszystkich. Są dostępne po prostu przez:
(W tym przypadku ciąg „Ok”). BTW, dostępne są również inne zasoby Androida, na przykład obrazy ikon itp.
źródło
Ciąg myString = getString (R.string.mystring);
łatwy sposób
źródło
Możesz wypróbować to w działaniu:
W innych sytuacjach, takich jak fragmenty, ... używaj
źródło
Dla bezpieczeństwa należy dodać: mContext.getResources (). GetString (R.string.your_string);
mContext może być: kontekstem w onAttach () fragmentu lub w działaniu.
źródło
Jeśli nie chcesz dostać się do działania lub fragmnet, to:
Jeśli chcesz pobrać go z klasy spoza działania lub fragmentu, w którym nie masz kontekstu działania, użyj kontekstu aplikacji:
źródło
Użyj tej linii bezpośrednio w pliku Java. Nie komplikuj.
źródło