2013-09-24 10 views
6

Come si implementa il cambio di lingua senza dover impostare manualmente la localizzazione all'interno di un'app Android? So che l'applicazione caricherà il file strings.xml in base alle impostazioni locali durante l'avvio, ma non voglio che questa scelta venga eseguita in base alle impostazioni locali del sistema, ma che sia specificata dall'utente nelle Impostazioni.Cambio lingua all'interno dell'app android

Oppure, imposta manualmente l'impostazione locale?

+0

Può essere più chiaro per favore? Vorresti che la lingua cambiasse in base alle impostazioni dell'app anziché alle impostazioni locali del dispositivo? –

+0

Sì, desidero cambiare la lingua dell'app in base alle impostazioni dell'app. –

risposta

18

È possibile estendere la classe Application (è necessario dichiararlo anche nel manifest) e inserire qualcosa di simile.

Ogni volta che si desidera cambiare la lingua si può quindi chiamare

((App)getApplicationContext()).changeLang(lang); 

da dentro la vostra attività. R.string.locale_lang è solo una chiave che viene memorizzato in strings.xml per le preferenze condivise

public class App extends Application { 

    private Locale locale = null; 

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

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); 
     String lang = settings.getString(getString(R.string.locale_lang), ""); 
     changeLang(lang); 
    } 

    public void changeLang(String lang) { 
     Configuration config = getBaseContext().getResources().getConfiguration(); 
     if (!"".equals(lang) && !config.locale.getLanguage().equals(lang)) { 

      Editor ed = PreferenceManager.getDefaultSharedPreferences(this).edit(); 
      ed.putString(getString(R.string.locale_lang), lang); 
      ed.commit(); 

      locale = new Locale(lang); 
      Locale.setDefault(locale); 
      Configuration conf = new Configuration(config); 
      conf.locale = locale; 
      getBaseContext().getResources().updateConfiguration(conf, getBaseContext().getResources().getDisplayMetrics()); 
     } 
    } 

    public String getLang(){ 
     return PreferenceManager.getDefaultSharedPreferences(this).getString(this.getString(R.string.locale_lang), ""); 
    } 



} 
+0

Grazie. Ho un'idea. Ma come posso dichiararlo nel manifest? non come attività immagino. –

+1

no non come attività ma è presente un tag applicazione che include tag attività. Come attributo all'applicazione devi aggiungere android: name = ". App" – kjurkovic

Problemi correlati