2013-08-21 20 views
5

Chcę, aby mój język zmieniał się dynamicznie i próbuję użyć onConfigurationChanged, ale nie jest wywoływany. Mam funkcję MainActivity, która tworzy pasek akcji i viewpager. Reszta moich stron to Fragmenty. W mojej sekcji Ustawienia mam przycisk, aby przełączyć język na francuski.Ustawienia regionalne: onConfigurationChanged nie nazywane

langChange.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View vi) { 
      MainActivity main = (MainActivity)getActivity(); 
      main.langChange(); 
     } 

}); 

Wtedy w moim główną działalność Mam

@Override 
public void onConfigurationChanged(Configuration newConfig){ 
    super.onConfigurationChanged(newConfig); 
    if (locale != null){ 
     newConfig.locale = locale; 
     Locale.setDefault(locale); 
     getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics()); 
    } 
} 

public void langChange(){ 
    if(currentLanguage == FRENCH_LANGUAGE){ 
     locale = new Locale("en"); 
     Locale.setDefault(locale); 
     Configuration c = getBaseContext().getResources().getConfiguration(); 
     c.locale = locale; 
     getBaseContext().getResources().updateConfiguration(c,getBaseContext().getResources().getDisplayMetrics()); 
     currentLanguage = "English"; 
    } 
    else if(currentLanguage == ENGLISH_LANGUAGE){ 
     locale = new Locale("fr"); 
     Locale.setDefault(locale); 
     Configuration c = getBaseContext().getResources().getConfiguration(); 
     c.locale = locale; 
     getBaseContext().getResources().updateConfiguration(c,getBaseContext().getResources().getDisplayMetrics()); 
     currentLanguage = "French"; 
    } 
    actionBar.setSelectedNavigationItem(actionBar.getTabCount() - 1); //This just puts it back to the settings tab 
} 

onConfigurationChanged nie jest wywoływana. W swoim manifeście mam:

<activity android:name="MainActivity" android:screenOrientation="portrait" android:configChanges="locale"></activity> 

Próbowałem dodając jedną lub wszystkie z tych opcji orientation|keyboardHidden|screenSize bez powodzenia.

Powodem tego wszystkiego jest to, że chcę zmienić tekst akcji i cały tekst po kliknięciu przycisku. Mam oddzielny plik napisów dla języka francuskiego.

Każda pomoc będzie świetna.

+0

Skąd wiesz, że 'onConfigurationChanged' nie jest wywoływany? Masz sprawdzanie 'null' wokół kodu wewnątrz metody, co może być problemem. Spójrz na to pytanie: http://stackoverflow.com/questions/6457659/android-onconfigurationchanged-not-being-called – Darwind

+0

Dodałem punkty przerwania przed i po instrukcji if również z 'Log.d'. Wiem, że to nie działa na tę metodę. Spojrzałem również na powyższe pytanie, a te odpowiedzi nie rozwiązują mojego problemu. – BigT

Odpowiedz

4

Ok, trochę się nad tym zastanawiałem.

Nie jestem pewien, dlaczego metoda onConfigurationChanged nie jest wywoływana, więc mam nadzieję, że ktoś może oświecić nas w tej części.

W moich poszukiwaniach natknąłem się na to tutorial, które faktycznie zmieniają Locale, zmieniając konfigurację.

Twój kod wygląda trochę jak w rzeczywistości tym tutorialu ;-)

Anyways, ważną rzeczą w tutorialu i kod jest ta metoda:

private void updateTexts() { 
    txt_hello.setText(R.string.hello_world); 
    btn_en.setText(R.string.btn_en); 
    btn_ru.setText(R.string.btn_ru); 
    btn_fr.setText(R.string.btn_fr); 
    btn_de.setText(R.string.btn_de); 
} 

To właśnie „magia” dzieje ; po zmianie ustawień regionalnych konieczne będzie ponowne załadowanie zasobów, a ponieważ powiedziałeś Androidowi, że chcesz obsługiwać niektóre konfiguracje samodzielnie, musisz ponownie załadować cały tekst, ustawiając ponownie teksty elementów interfejsu użytkownika.

Po wykonaniu tej czynności aplikacja załaduje ciągi z określonego folderu ustawień regionalnych.

Odpowiedź na Android dlaczego zachowuje się w ten sposób, można znaleźć w official documentation dla Activity mówiąc:

[...]

Dzieje się tak dlatego każdy zasób aplikacji, w tym plików układu , może zmieniać się na podstawie dowolnej wartości konfiguracji. Tak więc jedynym bezpiecznym sposobem obsługi zmiany konfiguracji jest ponowne pobranie wszystkich zasobów, w tym układów, elementów i ciągów. Ponieważ działania muszą już wiedzieć, jak zapisać ich stan i odtworzyć się z tego stanu, jest to wygodny sposób na ponowne uruchomienie działania z nową konfiguracją.

Facet pisanie samouczek był na tyle uprzejmy, aby dodać cały projekt samouczka do pobrania, więc polecam Ci to sprawdzić, aby zobaczyć jak to działa, bo to działa ;-) Można outcomment się onConfigurationChanged metoda, ponieważ wydaje się, że nic nie robi.

Mam nadzieję, że to pomoże.

+0

Jesteś bogiem, który to odkrył. To jest idealne. Kilka zmian muszę zrobić, aby dopasować go do mojego kodu, ale działa idealnie !!!! Dzięki – BigT

+0

Zawsze - uwielbiam kopać ;-) – Darwind

6

Musisz zdefiniować android: configChanges = "layoutDirection | locale", aby wywołać onConfigurationChanged().

+0

to w rzeczywistości nie działa –

+3

Ma całkowitą rację, dodając "layoutDirection" działa, bez niego. – marco

+0

To też zadziałało dla mnie, czy miałeś pojęcie, co jest za tym tłem? –

Powiązane problemy