2013-08-21 9 views
5

Desidero che la mia lingua cambi dinamicamente e sto cercando di utilizzare onConfigurationChanged ma non viene chiamata. Ho un MainActivity che crea la mia barra delle azioni e il viewpager. Il resto delle mie pagine sono Frammenti. Nel mio SettingsFragment ho un pulsante per passare la lingua al francese.Impostazioni locali: onConfigurationChanged non chiamato

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

}); 

Poi nel mio MainActivity devo

@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 
} 

Il onConfigurationChanged non viene chiamato. Nel mio manifesto ho:

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

Ho provato ad aggiungere una o tutte queste opzioni orientation|keyboardHidden|screenSize senza successo.

Il motivo di tutto questo è perché voglio modificare il testo di azioneBar e tutto il resto del testo dopo aver fatto clic sul pulsante. Ho un file di stringhe separato per il francese.

Qualsiasi aiuto sarebbe fantastico.

+0

Come fai a sapere che 'onConfigurationChanged' non viene chiamato? Hai un controllo per 'null' attorno al codice all'interno del metodo, che potrebbe essere il problema. Dai anche un'occhiata a questa domanda: http://stackoverflow.com/questions/6457659/android-onconfigurationchanged-not-being-called – Darwind

+0

Ho aggiunto breakpoint prima e dopo anche l'istruzione if con 'Log.d'. So che non ha colpito questo metodo. Ho anche esaminato la domanda sopra e quelle risposte non risolvono il mio problema – BigT

risposta

4

Ok, ci ho pensato un po '.

Non sono sicuro, perché il metodo onConfigurationChanged non viene chiamato, quindi spero che qualcuno possa illuminarci su questa parte.

Nella mia ricerca sono incappato in questo tutorial, che in realtà cambia il Locale, modificando la configurazione.

Il codice assomiglia molto a questo tutorial in realtà ;-)

In ogni modo, la cosa importante circa il tutorial e il codice è questo metodo:

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); 
} 

Questo è dove la "magia" avviene ; dopo aver cambiato la tua localizzazione dovrai ricaricare le tue risorse e dato che hai detto ad Android che vuoi gestire alcune configurazioni da solo, devi ricaricare tutto il tuo testo, impostando nuovamente i testi degli elementi dell'interfaccia utente.

Al termine, l'applicazione carica le stringhe dalla cartella locale specifica.

La risposta al perché Android si comporta in questo modo, può essere trovato nel official documentation per il Activity dicendo:

[...]

Ciò avviene perché qualsiasi risorsa applicazione, inclusi i file di layout , può cambiare in base a qualsiasi valore di configurazione. Pertanto, l'unico modo sicuro per gestire una modifica alla configurazione è recuperare nuovamente tutte le risorse, inclusi i layout, i drawable e le stringhe. Poiché le attività devono già sapere come salvare il loro stato e ricreare se stessi da quello stato, questo è un modo conveniente per riavviare un'attività con una nuova configurazione.

Il ragazzo scrivere il tutorial è stato così gentile da aggiungere l'intero progetto esercitazione come download, quindi vi consiglio di andare a controllare per vedere come funziona, perché si sta lavorando ;-) È possibile outcomment il onConfigurationChanged metodo, in quanto sembra non fare nulla.

Spero che questo aiuti.

+0

Sei un dio per averlo trovato. È perfetto. Un paio di cambiamenti che devo fare per adattarlo al mio codice ma funziona perfettamente !!!! Grazie – BigT

+0

In qualsiasi momento - adoro scavare in giro ;-) – Darwind

6

È necessario definire android: configChanges = "layoutDirection | locale" per poter chiamare onConfigurationChanged().

+0

questo in realtà non funziona –

+3

Ha perfettamente ragione, aggiungendo "layoutDirection" funziona, senza. – marco

+0

Questo ha funzionato anche per me, hai qualche idea su quale sia lo sfondo? –

Problemi correlati