2013-11-04 18 views
10

Stworzyłem aplikację na Androida (posiadającą dwa języki). Wprowadziłem moje ciągi zasobów w dwóch plikach:Po obróceniu ekranu język mojej aplikacji zostanie zmieniony

For Persian language (default) 
values/strings_locale.xml‬ 

For English language 
values-en/strings_locale.xml‬ 

I moje pierwsze uruchomienie aktywny mam wstawiony następujący kod:

Configuration c = new Configuration(this.getResources().getConfiguration()); 
c.locale = new Locale("fa_IR"); 

this.getResources().updateConfiguration(c, this.getResources().getDisplayMetrics()); 

Więc po tym kodzie mój język domyślny będzie perski i wszystkich ciągi we wszystkich działaniach są wyświetlane w języku perskim poprawnie.

Ale problem pojawia się, gdy ekran urządzenia jest obrócony, wszystkie ciągi są wyświetlane w języku angielskim i ma to miejsce w przypadku wszystkich innych czynności! I muszę zamknąć i ponownie otworzyć moją aplikację.

Dlaczego tak się dzieje i jak mogę rozwiązać ten problem?

+1

Sprawdź [dokumentacja ta] (http://developer.android.com/guide/components/activities.html), gdy Aktywność jest odtwarzana po obrocie, powyższy kod prawdopodobnie nie jest uruchamiany ponownie ... upewnij się, że umieściłeś kod w miejscu, w którym można go ponownie przetworzyć po obrocie. – Mikel

Odpowiedz

23

Możesz utworzyć klasę, która rozszerza się o Application. Tam możesz zastąpić jedną metodę, która będzie wywoływana za każdym razem, gdy zmienisz konfigurację (przykład, gdy zmieni się orientacja ekranu).

Coś jak:

public class MyApplication extends Application { 
    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     setLocale(); 
    } 

    private void setLocale() { 
     Locale locale = new Locale("fa_IR"); 
     Locale.setDefault(locale); 
     Configuration config = new Configuration(); 
     config.locale = locale; 
     getBaseContext().getResources().updateConfiguration(config, 
       getBaseContext().getResources().getDisplayMetrics()); 
    } 
} 

I nie zapomnij zadeklarować ją w manifeście: example of Application class

W AndroidManifest.xml:

<application 
    android:name="com.blaablaa.bumbam.MyApplication" 
    ... 
+0

Dzięki! Bardzo dobre rozwiązanie! – breceivemail

0

Nie do końca rozumiem, co próbujesz zrobić. Ale generalnie nie musisz zarządzać językiem aplikacji. Android automatycznie wybierze język telefonu, jeśli jest dostępny, aw każdym innym przypadku otworzy okno dialogowe wyboru języka.

Jeśli chcesz ustawić język niezależny od tego za pomocą kodu - czego nie polecam - prawdopodobnie prawdopodobnie wystąpi problem z twoim cyklem życia, co uniemożliwi ponowne uruchomienie kodu po zmianie orientacji. Mogę ci w tym pomóc, jeśli zamieścisz więcej kodu.

+1

Jest to możliwe. Jeśli umieścisz kod, o którym wspomniałem w twojej pierwszej aktywności, wszystkie twoje działania będą pokazywane w tym języku. Możesz to przetestować. Mój problem polega na tym, że kiedy obracam urządzeniem na przykład w trzecim działaniu, język całej działalności mojej aplikacji zmienia się na angielski. – breceivemail

+0

Wiem, że to możliwe. Mówię tylko, że nie powinieneś tego robić. Ale jeśli nadal chcesz, żebym ci pomógł, musisz opublikować więcej kodu. –

0

Można tworzyć niestandardowe ContextWrapper

public class mContextWrapper extends ContextWrapper { 
    public mContextWrapper(Context base){ 
     super(base); 
    } 

    @SuppressWarnings("deprecation") 
    public static ContextWrapper wrap(Context context, String language) { 
     Configuration config = context.getResources().getConfiguration(); 
     Locale sysLocale = null; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
      sysLocale = getSystemLocale(config); 
     } else { 
      sysLocale = getSystemLocaleLegacy(config); 
     } 
     if (!language.equals("") && !sysLocale.getLanguage().equals(language)) { 
      Locale locale = new Locale(language); 
      Locale.setDefault(locale); 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
       setSystemLocale(config, locale); 
      } else { 
       setSystemLocaleLegacy(config, locale); 
      } 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
       context = context.createConfigurationContext(config); 
      } else { 
       context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics()); 
      } 
     } 
     return new mContextWrapper(context); 
    } 

    @SuppressWarnings("deprecation") 
    public static Locale getSystemLocaleLegacy(Configuration config){ 
     return config.locale; 
    } 

    @TargetApi(Build.VERSION_CODES.N) 
    public static Locale getSystemLocale(Configuration config){ 
     return config.getLocales().get(0); 
    } 

    @SuppressWarnings("deprecation") 
    public static void setSystemLocaleLegacy(Configuration config, Locale locale){ 
     config.locale = locale; 
    } 

    @TargetApi(Build.VERSION_CODES.N) 
    public static void setSystemLocale(Configuration config, Locale locale){ 
     config.setLocale(locale); 
    } 
} 

aw swojej działalności attachBaseContext dołączyć zwyczaj ContextWrapper

@Override 
    protected void attachBaseContext(Context newBase) { 
     globalClass = (YouAppClass)newBase.getApplicationContext(); 
     //try geting the lang you have setted inside your YouAppClass class 
     // or you can use shared preferences for it 
     //pref = PreferenceManager.getDefaultSharedPreferences(newBase) 
     lang=globalClass .getLang(); 
     super.attachBaseContext(mContextWrapper.wrap(newBase,lang)); 
    } 
Powiązane problemy