2010-02-24 17 views
16

Intento forzar la configuración regional de mi aplicación para el usuario especificado. Como esto se puede usar para demostraciones, quiero cambiar el idioma/configuración regional en la aplicación y no en cualquier momento para todo el dispositivo.Android - Restablecimiento del entorno nacional forzado en los cambios de orientación

Miré a mi alrededor e intenté utilizar cada pista que encontré aquí. El resultado: puedo reiniciar la actividad de prueba con el nuevo idioma, pero si cambio la orientación, la configuración regional siempre se restablecerá al dispositivo.

I uploaded a minimalistic project para que pueda reproducir mi problema. Por favor, ignore la reducción de la IU, no es importante :)

Respuesta

2

¿Se produce el restablecimiento de la configuración regional debido a que su Actividad se reinicia al cambiar la orientación?

Si es así, puede interceptar o prevenir cambios de orientación: Activity restart on rotation Android

+0

I "reinicio" mi actividad con acabado() y startActivity() para forzar la recarga de la IU que usa la nueva configuración regional.El cambio de orientación siempre restablece mi configuración regional – WarrenFaith

3

Acabo de ver su código.

Compruebe que el Locale que está utilizando es de java.util y no de android. Su código no cambiará la configuración regional del teléfono celular.

para probarlo:

  • puse mi teléfono al español.
  • abrir su aplicación
  • clic en el botón
  • Ir al Inicio
  • iconos estaban en español en lugar de Inglés.

Si lo que está tratando de hacer es establecer la configuración regional a un defecto y ser capaz de ver el mismo valor después de una rotación de la pantalla:

En lugar de:

android:configChanges="locale" 

uso:

android:configChanges="locale|orientation" 
9

Este fragmento de código hace lo que necesita, lo he probado. Supongamos, por ejemplo, que desea que el usuario pueda cambiar de idioma a través de un menú de su actividad principal. Puede hacerlo a través de ahorro de una bandera lenguaje como una preferencia de usuario y comprobar que en "onCreate()" y en "onConfigurationChanged()" de la siguiente manera:

public class MainActivity extends Activity { 

SharedPreferences mPrefs1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this); 
    String languageToLoad = mPrefs1.getString("languagePref", Locale.getDefault().getLanguage()); 
    Locale locale = new Locale(languageToLoad); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics()); 

    setContentView(R.layout.activity_main); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this); 
    String languageToLoad = mPrefs1.getString("languagePref", Locale.getDefault().getLanguage()); 
    Locale locale = new Locale(languageToLoad); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics()); 
    setContentView(R.layout.activity_main); 
} 

// Declaring the Menu options 
@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{  
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main_menu, menu); 
    return true; 
} 

//handle menu item selection 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    switch (item.getItemId()) { 
    case R.id.menu_switch_language: 
     String languageToLoad = getResources().getString(R.string.switch_language); 

     mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this); 
     SharedPreferences.Editor editor = mPrefs1.edit(); 
     editor.putString("languagePref", languageToLoad); 
     editor.commit(); // Very important to save the preference      
     finish(); 
     startActivity(getIntent()); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

}

2

Usted debe forzar a su entorno local en el Aplicación :: onCreate y Aplicación :: onConfigurationChanged. No se olvide de registrar su clase de aplicación en AndroidManifest.xml

3

Lo que funcionó para mí está marcando la localización derecha antes del hinchado de sus diseños:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    String userLocale = "Wolof"; // adapt to your need 
    Locale locale = new Locale(userLocale); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 

    setContentView(R.layout.my_activity); 

    ... 

} 
Cuestiones relacionadas