default()jest dość bezpiecznym zakładem, po prostu nie używaj go do przetwarzania (jak mówią doktorzy).
A - C
@ A - C użyć go do przetwarzania?
CQM,
Tak, zobacz, co mówią doktorzy : niektóre lokalizacje używają „,” jako przecinka dziesiętnego i „.” do grupowania cyfr. więc rzeczy takie jak parseInt () mogą zawieść. Pamiętaj, że nadal zalecają używanie default(), ale nie do rzeczy, które mogą uszkodzić kod.
A - C
Odpowiedzi:
487
Wartość domyślna Localejest budowana statycznie w czasie wykonywania procesu aplikacji na podstawie ustawień właściwości systemowych, więc będzie reprezentować Localewybrane na tym urządzeniu podczas uruchamiania aplikacji . Zazwyczaj jest to w porządku, ale oznacza to, że jeśli użytkownik zmieni swoje Localeustawienia po uruchomieniu procesu aplikacji, wartość parametru getDefaultLocale()prawdopodobnie nie zostanie natychmiast zaktualizowana.
Jeśli z jakiegoś powodu potrzebujesz pułapkować takie zdarzenia w swojej aplikacji, możesz zamiast tego spróbować uzyskać Localedostępne z Configurationobiektu zasobu , tj
Locale current = getResources().getConfiguration().locale;
Może się okazać, że ta wartość jest aktualizowana szybciej po zmianie ustawień, jeśli jest to konieczne dla Twojej aplikacji.
Czy ktoś sprawdził, że domyślne ustawienia regionalne nie zostały zmienione w aplikacji podczas zmiany w systemie? Myślę, że to jedna z tych „zmian konfiguracji”, które powodują, że działania są niszczone i odtwarzane
Michał K
11
Przetestowałem to, generując oba, zmieniając ustawienia regionalne; wynik jest taki, że wynik jest taki sam. Dlatego Locale.getDefault () może być bezpiecznie używany, ponieważ jest natychmiast aktualizowany. Log.d("localeChange", "Default locale lang: " + Locale.getDefault().getLanguage()); Log.d("localeChange", "Config locale lang: " + getResources().getConfiguration().locale.getLanguage());
Alessio
58
Zostało to uznane za przestarzałe w klasie Konfiguracja, zobacz najnowsze dokumenty dotyczące tej porady:locale This field was deprecated in API level 24. Do not set or read this directly. Use getLocales() and setLocales(LocaleList). If only the primary locale is needed, getLocales().get(0) is now the preferred accessor.
MrBigglesworth
7
dlaczego po prostu nie dodają metody getFirstLocale (), aby uniknąć tego dziwnego getLocales (). get (0)?
user3290180,
1
Co jeśli chcesz obsługiwać starsze i nowsze wersje interfejsu API?
Ivan
179
Aktualizacja Androida N (poziom interfejsu API 24) (bez ostrzeżeń):
Czy w bibliotece pomocy jest coś, czego można uniknąć w przypadku if-else?
Federico Ponzi
8
@TargetApi (Build.VERSION_CODES.N) nie jest potrzebny w kodzie, jeśli podasz kod „if” i „fallback”
Patrick Favre,
@FedericoPonzi no ResourceCompat nie wydaje się mieć metody dla ustawień regionalnych od 25.0.1
Patrick Favre
2
Może to nie działać, jeśli użytkownik ma zainstalowanych wiele języków. Powinieneś użyć, LocaleList.getDefault().get(0);ponieważ spowoduje to zwrócenie ustawień regionalnych posortowanych według preferowanego języka.
Curly
21
@FedericoPonzi @ for3st Znalazłem to ConfigurationCompat, jakoConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
yuval
63
Jeśli korzystasz z Biblioteki pomocy technicznej Androida, możesz ConfigurationCompatpozbyć się ostrzeżeń o rezygnacji z metody @ Makalele:
Locale current =ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);
lub w Kotlin:
val currentLocale =ConfigurationCompat.getLocales(resources.configuration)[0]
ta odpowiedź jest nieprawidłowa, domyślna lokalizacja, ale jeśli użytkownik zmienił ją w locie, pokaże to źle. następna odpowiedź jest poprawna
użytkownik170317,
zgodził się, zła odpowiedź. W moim przypadku szukałem sposobu, aby nie musiałem używać getResources (), co oznacza, że potrzebuję kontekstu. Moim problemem była klasa pomocnicza, która nie miała kontekstu, ale zgaduję, że muszę ją przekazać. Jeśli masz aplikację, która pozwala ludziom zmieniać ich ustawienia regionalne i ciągi widoków, formaty liczb itp., To wtedy musisz użyć odpowiedzi
Devunwired
Pracuj dla mnie. Jeśli ustawię punkt przerwania na Locale.setDefault(), zostanie on wywołany, gdy zmienię język urządzenia przynajmniej z powrotem na Androida 5.0 (o ile testowałem)
przebiegły
6
Wszystkie odpowiedzi powyżej - nie działają. Dlatego dodam tutaj funkcję, która działa na Androidzie 4 i 9
Jedna z niewielu odpowiedzi, która zwraca preferowany przez użytkownika kierunek języka na poziomie urządzenia. Możesz także użyć, LocaleListCompat.getDefault()jeśli używasz AndroidaX.
default()
jest dość bezpiecznym zakładem, po prostu nie używaj go do przetwarzania (jak mówią doktorzy).default()
, ale nie do rzeczy, które mogą uszkodzić kod.Odpowiedzi:
Wartość domyślna
Locale
jest budowana statycznie w czasie wykonywania procesu aplikacji na podstawie ustawień właściwości systemowych, więc będzie reprezentowaćLocale
wybrane na tym urządzeniu podczas uruchamiania aplikacji . Zazwyczaj jest to w porządku, ale oznacza to, że jeśli użytkownik zmieni swojeLocale
ustawienia po uruchomieniu procesu aplikacji, wartość parametrugetDefaultLocale()
prawdopodobnie nie zostanie natychmiast zaktualizowana.Jeśli z jakiegoś powodu potrzebujesz pułapkować takie zdarzenia w swojej aplikacji, możesz zamiast tego spróbować uzyskać
Locale
dostępne zConfiguration
obiektu zasobu , tjMoże się okazać, że ta wartość jest aktualizowana szybciej po zmianie ustawień, jeśli jest to konieczne dla Twojej aplikacji.
źródło
Log.d("localeChange", "Default locale lang: " + Locale.getDefault().getLanguage()); Log.d("localeChange", "Config locale lang: " + getResources().getConfiguration().locale.getLanguage());
locale This field was deprecated in API level 24. Do not set or read this directly. Use getLocales() and setLocales(LocaleList). If only the primary locale is needed, getLocales().get(0) is now the preferred accessor.
Aktualizacja Androida N (poziom interfejsu API 24) (bez ostrzeżeń):
źródło
LocaleList.getDefault().get(0);
ponieważ spowoduje to zwrócenie ustawień regionalnych posortowanych według preferowanego języka.ConfigurationCompat
, jakoConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
Jeśli korzystasz z Biblioteki pomocy technicznej Androida, możesz
ConfigurationCompat
pozbyć się ostrzeżeń o rezygnacji z metody @ Makalele:lub w Kotlin:
źródło
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
Z
getDefault
dokumentacji:Również z
Locale
dokumentów:Wydaje się, że powinieneś go po prostu użyć.
źródło
Locale.setDefault()
, zostanie on wywołany, gdy zmienię język urządzenia przynajmniej z powrotem na Androida 5.0 (o ile testowałem)Wszystkie odpowiedzi powyżej - nie działają. Dlatego dodam tutaj funkcję, która działa na Androidzie 4 i 9
źródło
LocaleListCompat.getDefault()
jeśli używasz AndroidaX.Użyłem tego:
źródło
Zgodnie z oficjalną dokumentacją ConfigurationCompat jest przestarzały w bibliotekach pomocniczych
Możesz rozważyć użycie
LocaleListCompat.getDefault()[0].toLanguageTag()
Pozycja 0 będzie preferowanym miejscem użytkownikaAby uzyskać Domyślne ustawienia regionalne na 0 pozycji byłoby
LocaleListCompat.getAdjustedDefault()
źródło