2010-04-15 13 views
23

Così ho una lingua nella mia applicazione. Quando la lingua è attiva, vorrei che tutte le visioni testuali ecc cambiassero la lingua immediatamente. Attualmente cambio solo le impostazioni locali nella configurazione, quindi la lingua è cambiata quando l'utente riavvia l'attività.Modifica impostazioni locali: forza l'attività per ricaricare le risorse?

Una brutta soluzione al mio problema sarebbe quella di rendere ogni vista testuale caricare le nuove risorse ogni volta che la lingua viene cambiata. C'è una soluzione migliore? Forse un modo pulito per riavviare discretamente l'attività? O forse basta forzare la ricarica delle risorse?

risposta

18

Nel vostro AndroidManifest.xml, aggiungere questo attributo alla vostra attività

android:configChanges="locale" 

Nella vostra attività di override

@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

Si presume che si attivi quando chiamo resource.updateConfiguration()? Al momento non sto avendo alcun successo con l'esecuzione di onConfigurationChanged(). : '( – pgsandstrom

+1

onConfigurationChanged() deve attivare quando la lingua viene cambiata In realtà solo in cerca di nuovo v'è una bandiera rossa nella sua domanda, che ho perso prima volta, 'Ho un'impostazione della lingua nella mia richiesta' Questo vuoi dire.. non stanno utilizzando la funzione di impostazione della lingua del dispositivo Android? –

+1

Non sono sicuro di cosa intendi? Ma io uso le impostazioni locali del telefono quando l'app viene avviata per la prima volta, e ho diverse risorse contrassegnate per esempio values-en, values-fr, values-de ecc. Voglio solo che l'utente possa avere la mia app in una lingua diversa, quindi il telefono. Non so perché, ma alcuni utenti hanno richiesto questa funzione. – pgsandstrom

0

io non sono sicuro perché questo isn raccolto da .

Ehi, Sandis, cosa si intende il metodo non chiamato nella vostra attività quando è stata modificata la lingua? Ho incontrato lo stesso problema. Il problema forse è questo: quando cambiamo la lingua, l'attività va a onDestroy() (puoi provarlo), quindi non c'è nessuno da chiamare . Quando avvieremo di nuovo l'attività, viene chiamato lo onCreate(), non lo . C'è forse qualcosa di diverso nel cambio di localizzazione e nel cambiamento di orientamento.

+1

Davvero dispiaciuto, è un mio errore: la mia attività è un'attività incorporata di una tabulazione, quando aggiungi android: configChanges = "locale" alla tabella, funziona bene, non va a onDestroy() quando cambia la lingua, e chiama onConfigurationChanged() nella tabella, ma questo metodo non viene richiamato nell'attività incorporata. – himalayagiant

8

Penso che la domanda sia cambiare lingua in runtime per l'app e visualizzare i messaggi localizzati nell'interfaccia utente. android:configChanges="locale" chiamate onConfigurationChanged se le impostazioni internazionali del sistema vengono modificate (nelle impostazioni del dispositivo) mentre l'app è in esecuzione, e non se si modificano le impostazioni locali nel codice per la propria app, che presumo sia ciò che si desidera ottenere. Ecco perché non è rinfrescante.

6

Ecco il metodo che uso durante ogni attività onCreate() o onResume() a seconda delle mie esigenze (se la mia attività sarà riprendendo dopo che l'utente ha cambiato le impostazioni della lingua o sarà sempre creato con la lingua già impostata):

Da lì ho appena aggiornato la vista manualmente o da onConfigurationChanged() che viene chiamata dopo il completamento di questo metodo.

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

ottimo pensiero. un metodo per tutte le attività. – SMR

+1

Cosa succede se si fa questo in un frammento - come si aggiorna la lingua locale lì? –

+0

Risposta perfetta Grazie @ 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

Supponendo che si sta cambiando la lingua attraverso qualcosa di simile

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

Avrete bisogno di chiamare Activity.recreate() in tutte le attività attualmente aperti, che è ciò che accadrebbe se l'utente ha cambiato il lingua di sistema mentre non ti sei iscritto a android:configChanges="locale".

+0

Una spiegazione per i downvotes sarebbe molto apprezzata. – Thorbear

Problemi correlati