Cambiare Locale all'interno dell'applicazione stessa

I miei utenti possono modificare il locale all'interno dell'app (possono desiderare di mantenere le impostazioni del telefono in inglese ma leggere il contenuto della mia applicazione in francese, in olandese o in qualsiasi altra lingua …)

Perché questo funziona perfettamente in 1.5 / 1.6 ma non in 2.0 più ???

  • Come get i contatti di whatsapp da Android?
  • Come posizionare pulsanti su Image in android?
  • come posso deselect o reimpostare il button di scelta rapida?
  • Come uccidere il process di logcat avviato dall'applicazione Android?
  • Traduzione di stringhe XML per Android
  • Come trovare la temperatura della città per longitudine e latitudine in android?
  • @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case 201: Locale locale2 = new Locale("fr"); Locale.setDefault(locale2); Configuration config2 = new Configuration(); config2.locale = locale2; getBaseContext().getResources().updateConfiguration( config2, getBaseContext().getResources().getDisplayMetrics()); // loading data ... refresh(); // refresh the tabs and their content refresh_Tab (); break; case 201: etc... 

    Il problema è che il MENU "si restringe" sempre più quando l'utente sta attraversando le righe di codice sopra …

    Questo è il menu che si riduce:

     @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, 100, 1, "REFRESH").setIcon(android.R.drawable.ic_menu_compass); SubMenu langMenu = menu.addSubMenu(0, 200, 2, "NL-FR").setIcon(android.R.drawable.ic_menu_rotate); langMenu.add(1, 201, 0, "Nederlands"); langMenu.add(1, 202, 0, "Français"); menu.add(0, 250, 4, R.string.OptionMenu2).setIcon(android.R.drawable.ic_menu_send); menu.add(0, 300, 5, R.string.OptionMenu3).setIcon(android.R.drawable.ic_menu_preferences); menu.add(0, 350, 3, R.string.OptionMenu4).setIcon(android.R.drawable.ic_menu_more); menu.add(0, 400, 6, "Exit").setIcon(android.R.drawable.ic_menu_delete); return super.onCreateOptionsMenu(menu); } 

    Cosa devo fare a livello API 5 per ripristinare questo lavoro?

    QUI È IL CODICE COMPLETO SE VUOI TESTARE QUESTO:

     import java.util.Locale; import android.app.Activity; import android.content.res.Configuration; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.widget.Toast; public class Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu) { SubMenu langMenu = menu.addSubMenu(0, 200, 2, "NL-FR").setIcon(android.R.drawable.ic_menu_rotate); langMenu.add(1, 201, 0, "Nederlands"); langMenu.add(1, 202, 0, "Français"); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case 201: Locale locale = new Locale("nl"); Locale.setDefault(locale); Configuration config = new Configuration(); config.locale = locale; getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); Toast.makeText(this, "Locale in Nederlands !", Toast.LENGTH_LONG).show(); break; case 202: Locale locale2 = new Locale("fr"); Locale.setDefault(locale2); Configuration config2 = new Configuration(); config2.locale = locale2; getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics()); Toast.makeText(this, "Locale en Français !", Toast.LENGTH_LONG).show(); break; } return super.onOptionsItemSelected(item); } } 

    E QUI È IL MANIFESTO:

     <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.cousinHub.ChangeLocale" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Main" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" /> </manifest> 

    QUESTO È COSA HO TROVATO:

     <uses-sdk android:minSdkVersion="5" /> 

    => FUNZIONA SOLO FINE …

     <uses-sdk android:minSdkVersion="3" /> 

    => Il menu si riduce each volta che si cambia la locale !!!

    poichè voglio mantenere la mia applicazione accessibile agli utenti su 1.5, cosa devo fare?

  • findViewById () restituisce null per il componente personalizzato in layout XML, non per altri componenti
  • Android ottiene l'image a pieno formato dalla camera
  • onTokenRefresh non viene chiamato in APK firmato, se la versione precedente dell'applicazione installata non ha implementato FCM
  • Eccezione di connessione Android http
  • Come get i dettagli del dispositivo client collegato a hotspot wifi?
  • Come posso impostare il colore della barra di valutazione di android? (Non il colore delle stelle ma il BORDER)
  • 6 Solutions collect form web for “Cambiare Locale all'interno dell'applicazione stessa”

    Attraverso la domanda originale non è esattamente circa la locale stessa tutte le altre questioni relative a locali si riferiscono a questo. Ecco perché ho voluto chiarire il problema qui. Ho usato questa domanda come punto di partenza per il mio codice locale di switching e ho scoperto che il metodo non è esattamente esatto. Funziona, ma solo fino ad each modifica della configuration (ad es. Rotazione dello schermo) e solo in quella particolare attività. Giocando con un codice per un po 'ho finito con il seguente approccio:

    Ho esteso l'applicazione android.app.Application e ho aggiunto il seguente codice:

     public class MyApplication extends Application { private Locale locale = null; @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()); } } @Override public void onCreate() { super.onCreate(); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); Configuration config = getBaseContext().getResources().getConfiguration(); String lang = settings.getString(getString(R.string.pref_locale), ""); if (! "".equals(lang) && ! config.locale.getLanguage().equals(lang)) { locale = new Locale(lang); Locale.setDefault(locale); config.locale = locale; getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); } } } 

    Questo codice assicura che each attività abbia impostazioni locali personalizzate e non verrà ripristinata durante la rotazione e altri events.

    Ho anche speso molto tempo cercando di applicare immediatamente la modifica delle preferenze, ma non sono riuscito: il linguaggio è stato modificato correttamente sul riavvio di attività, ma i formati di numero e le altre properties; locali non sono state applicate fino all'introduzione completa dell'applicazione.

    Modifiche a AndroidManifest.xml

    Non dimenticare di aggiungere android:configChanges="layoutDirection|locale" a tutte le attività di AndroidManifest, così come l' android:name=".MyApplication" all'elemento <application> .

    Dopo una buona notte di sonno, ho trovato la risposta sul Web (una semplice ricerca di Google nella seguente row " getBaseContext().getResources().updateConfiguration(mConfig, getBaseContext().getResources().getDisplayMetrics()); ), Ecco qui :

    link text => questo link mostra anche screenshots di quello che sta accadendo!

    Densità è stata la questione qui , ho avuto bisogno di avere questo nel AndroidManifest.xml

     <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true" /> 

    Il più importnte è l' android: anyDensity = "true" .

    Non dimenticare di aggiungere quanto segue per AndroidManifest.xml per each attività (per Android 4.1 e successivi):

     android:configChanges="locale" 

    Questa versione è necessaria quando si esegue la spiegazione per Android 4.2 (API livello 17) qui :

     android:configChanges="locale|layoutDirection" 

    In Android M la soluzione migliore non funziona. Ho scritto una class di helper per risolvere ciò che dovresti call dalla tua class di applicazioni e tutte le attività (vorrei suggerire la creazione di una BaseActivity e quindi fare in modo che tutte le Attività ereditino da esso.

    Nota : Questo supporterà anche la direzione di layout RTL correttamente.

    Classe di assistente:

     public class LocaleUtils { private static Locale sLocale; public static void setLocale(Locale locale) { sLocale = locale; if(sLocale != null) { Locale.setDefault(sLocale); } } public static void updateConfig(ContextThemeWrapper wrapper) { if(sLocale != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { Configuration configuration = new Configuration(); configuration.setLocale(sLocale); wrapper.applyOverrideConfiguration(configuration); } } public static void updateConfig(Application app, Configuration configuration) { if (sLocale != null && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { //Wrapping the configuration to avoid Activity endless loop Configuration config = new Configuration(configuration); // We must use the now-deprecated config.locale and res.updateConfiguration here, // because the replacements aren't available till API level 24 and 17 respectively. config.locale = sLocale; Resources res = app.getBaseContext().getResources(); res.updateConfiguration(config, res.getDisplayMetrics()); } } } 

    Applicazione:

     public class App extends Application { public void onCreate(){ super.onCreate(); LocaleUtils.setLocale(new Locale("iw")); LocaleUtils.updateConfig(this, getBaseContext().getResources().getConfiguration()); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); LocaleUtils.updateConfig(this, newConfig); } } 

    BaseActivity:

     public class BaseActivity extends Activity { public BaseActivity() { LocaleUtils.updateConfig(this); } } 

    Questo è per il mio commento sulla risposta di Andrey, ma non posso includere il codice nei commenti.

    Sei attività di preferenza chiamata da te attività principale? potresti metterlo nel ripristino …

     @Override protected void onResume() { if (!(PreferenceManager.getDefaultSharedPreferences( getApplicationContext()).getString("listLanguage", "en") .equals(langPreference))) { refresh(); } super.onResume(); } private void refresh() { finish(); Intent myIntent = new Intent(Main.this, Main.class); startActivity(myIntent); } 

    Non potrei usare Android: anyDensity = "true" perché gli oggetti nel mio gioco sarebbero stati posizionati completamente diversi … sembra anche questo il trucco:

     // creazione di locali
     Locale locale2 = nuovo Locale (loc); 
     Locale.setDefault (locale2);
     Configurazione config2 = nuova configuration ();
     config2.locale = locale2;
    
     // aggiornamento locale
     mContext.getResources (). updateConfiguration (config2, null);
    

    Se si desidera effettuare le opzioni del menu per cambiare immediatamente la locale. Devi fare così.

     //onCreate method calls only once when menu is called first time. public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); //1.Here you can add your locale settings . //2.Your menu declaration. } //This method is called when your menu is opend to again.... @Override public boolean onMenuOpened(int featureId, Menu menu) { menu.clear(); onCreateOptionsMenu(menu); return super.onMenuOpened(featureId, menu); } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.