2010-04-15 15 views
23

Mam więc ustawienie językowe w mojej aplikacji. Po zmianie języka chciałbym, aby wszystkie wyrazy tekstowe itp. Od razu zmieniły język. Obecnie po prostu zmieniam ustawienia regionalne w konfiguracji, więc język zmienił się, gdy użytkownik ponownie uruchomił działanie.Zmiana ustawień narodowych: Wymuś aktywność, aby ponownie załadować zasoby?

Brzydkim rozwiązaniem mojego problemu byłoby sprawienie, aby każdy widok tekstowy ładował nowe zasoby za każdym razem, gdy zmieni się język. Czy istnieje lepsze rozwiązanie? Być może to dobry sposób na dyskretne ponowne uruchomienie działania? A może po prostu wymusić ponowne załadowanie zasobów?

Odpowiedz

18

W swojej AndroidManifest.xml dodać ten atrybut do aktywności

android:configChanges="locale" 

W swojej działalności ręcznym

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    // refresh your views here 
    super.onConfigurationChanged(newConfig); 
} 

https://developer.android.com/guide/topics/manifest/activity-element.html#config

+0

Czy ma się to uruchamiać, gdy wywołuję metodę resource.updateConfiguration()? Im obecnie nie ma żadnego sukcesu z uruchomieniem onConfigurationChanged(). : '( – pgsandstrom

+1

onConfigurationChanged() powinien być wyzwalany po zmianie języka W rzeczywistości, po prostu spoglądam wstecz na czerwoną flagę w pytaniu, które za pierwszym razem przegapiłem: "Mam ustawienie językowe w mojej aplikacji." Czy to oznacza, że nie używasz urządzenia do ustawiania języka na urządzeniu z systemem Android? –

+1

Nie jestem pewien, co masz na myśli? Ale używam ustawień regionalnych telefonu, gdy aplikacja jest uruchamiana po raz pierwszy i mam kilka zasobów oznaczonych na przykład wartości-en, values-fr, values-de itd. Po prostu chcę, aby użytkownik mógł mieć moją aplikację w innym języku niż telefon. Nie wiem dlaczego, ale niektórzy użytkownicy zażądali tej funkcji. – pgsandstrom

0

Nie jestem pewien, dlaczego ten ISN odebrane przez .

Hej, Sandis, masz na myśli, że metoda nie wywołuje Twojej aktywności po zmianie języka? Spotkałem ten sam problem. Problem może być taki: gdy zmieniamy język, działanie przechodzi na onDestroy() (możesz to wypróbować), więc nie ma nikogo, kto zadzwoniłby pod numer . Gdy ponownie uruchomimy tę funkcję, zostanie wywołana nazwa onCreate(), a nie . Może być coś innego w zmianie lokalizacji i zmianie orientacji.

+1

Naprawdę przykro mi, to mój błąd: moja aktywność jest osadzoną czynnością tabactivity, kiedy dodaję android: configChanges = "locale" do tabactivity, działa dobrze, nie przejdzie on onDestroy() przy zmianie języka i będzie wywołaj metodę onConfigurationChanged() w tabactivity, ale ta metoda nie może wywołać działania osadzonego. – himalayagiant

8

Myślę, że pytanie polega na zmianie języka w środowisku wykonawczym dla aplikacji i wyświetlaniu zlokalizowanych wiadomości w interfejsie użytkownika. android:configChanges="locale" dzwoni pod numer onConfigurationChanged, jeśli ustawienia regionalne systemu zostały zmienione (w ustawieniach urządzenia) podczas działania aplikacji, a nie, jeśli zmienisz ustawienia regionalne w kodzie aplikacji, co, jak sądzę, jest tym, co chcesz osiągnąć. Dlatego nie jest odświeżający.

6

Oto metoda używam podczas każdej aktywności onCreate() lub onResume(), w zależności od swoich potrzeb (jeśli moja działalność będzie wznowienie po użytkownik zmienił ustawienia języka lub zawsze będą tworzone z językiem już ustawione):

Stamtąd właśnie odświeżam widok ręcznie lub z onConfigurationChanged(), który zostanie wywołany po zakończeniu tej metody.

public static void changeLocale(Activity activity, String language) 
{ 
    final Resources res = activity.getResources(); 
    final Configuration conf = res.getConfiguration(); 
    if (language == null || language.length() == 0) 
    { 
     conf.locale = Locale.getDefault(); 
    } 
    else 
    { 
     final int idx = language.indexOf('-'); 
     if (idx != -1) 
     { 
      final String[] split = language.split("-"); 
      conf.locale = new Locale(split[0], split[1].substring(1)); 
     } 
     else 
     { 
      conf.locale = new Locale(language); 
     } 
    } 

    res.updateConfiguration(conf, null); 
} 
+0

świetne myślenie. jedna metoda dla wszystkich działań. – SMR

+1

Co jeśli zrobisz to w Fragmentie - jak odświeżyć język lokalizacji? –

+0

Doskonała odpowiedź Dziękuję @ 3c71 –

0
public void settingLocale(Context context, String language) { 

Locale locale; 

Configuration config = new Configuration(); 

if(language.equals(LANGUAGE_ENGLISH)) { 

    locale = new Locale("en"); 

    Locale.setDefault(locale); 

    config.locale = locale; 

}else if(language.equals(LANGUAGE_ARABIC)){ 

    locale = new Locale("hi"); 

    Locale.setDefault(locale); 

    config.locale = locale; 

} 

context.getResources().updateConfiguration(config, null); 

// Here again set the text on view to reflect locale change 

// and it will pick resource from new locale 

tv1.setText(R.string.one); //tv1 is textview in my activity 

} 
-1

Zakładając jesteś zmiany języka przez coś jak

private void updateLocale(@NonNull final Context context, 
          @NonNull final Locale newLocale) { 
    final Resources resources = context.getResources(); 
    final DisplayMetrics displayMetrics = resources.getDisplayMetrics(); 
    final Configuration configuration = resources.getConfiguration(); 
    configuration.locale = newLocale; 
    resources.updateConfiguration(configuration, displayMetrics); 
    Locale.setDefault(newLocale); 
} 

Musisz zadzwonić Activity.recreate() we wszystkich aktualnie otwartych działań, co jest, co by się stało, jeśli użytkownik zmienił język systemu, gdy nie subskrybujesz numeru android:configChanges="locale".

+0

Wyjaśnienia dla downvotes będą mile widziane. – Thorbear

Powiązane problemy