2010-08-02 14 views
5

Me gustaría cambiar el idioma (configuración regional de la aplicación) mediante programación.Android y localización de menú

El principal problema para mí es la actualización de las etiquetas de menú.

He probado el siguiente método:

@Override 
public boolean onMenuOpened(int featureId, Menu menu) { 
    if (shouldChangeMenuLabels) { 
     for (int i = 0; i < menu.size(); i++) { 
      MenuItem menuItem = menu.getItem(i); 
      switch (menuItem.getItemId()) { 
       case R.id.menu_main_about: 
        menuItem.setTitle(R.string.menu_about); 
        break; 
       case R.id.menu_main_preferences: 
        menuItem.setTitle(R.string.menu_prefs); 
        break; 
      } 
     } 
     shouldChangeMenuLabels = false; 
    } 

Pero estoy seguro de que mala idea. Quiero evitar el uso de la sentencia switch-case ya que este no es un método universal (no puedo simplemente portar el recorte a otras actividades/no puedo hacer clases abstractas que harían eso).


Por cierto, todos los menús se han descrito en los archivos de menú/*. Xml, por lo que no quiero duplicar el código. ¿Alguien tiene ideas?

Preocupados por primera respuesta: Me hae cambiado la configuración regional con el siguiente código:

  Locale locale = new Locale((String)newValue); 
      Locale.setDefault(locale); 
      Configuration config = new Configuration(); 
      config.locale = locale; 
      getApplication().getResources().updateConfiguration(config, getApplication().getResources().getDisplayMetrics()); 

Pero como yo quiero controlar la rotación de cada actividad, nunca terminado. Tal vez hice algo mal?

Respuesta

5

No sé que es una buena idea, pero he encontrado siguiente manera:

@Override 
public boolean onMenuOpened(int featureId, Menu menu) { 
    if (shouldChangeLocale) { 
     menu.clear(); 
     MenuInflater inflater = getMenuInflater(); // -->onCreateMenu (Menu) 
     inflater.inflate(R.menu.menu_main, menu); ///
     shouldChangeLocale=false; 
    } 

    return super.onMenuOpened(featureId, menu); 
} 

necesito su consejo, debería hacer esto tal manera?

0

¿Leyó la documentación en Android Localization? Normalmente crea un archivo de cadenas diferente para cada idioma/configuración regional que desea admitir. En su archivo menu.xml, puede hacer referencia a los identificadores de cadena, y se seleccionará el valor adecuado en función de la configuración regional actual.

+0

Lo hice. (Me refiero a values-xx/string.xml y values ​​/ string.xml). ¿Quiere crear menu-xx/mymenu.xml? – davs

+0

Tiene valores-xx/string.xml con una cadena, menu_about y values-yy/string.xml con una cadena, menu_about. Establece la configuración regional de su teléfono en yy, y el valor de la cadena no cambia a yy? ¿Con qué entornos locales estás probando? http://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch habla sobre cómo decide qué valor usar, es posible que no tenga su configuración regional configurada correctamente. –

+0

Estoy probando con en/ru locales. Pero como no destruí las actividades, el menú no se ha actualizado. Por lo tanto, decidí borrar el menú y crearlo desde cero. – davs

0

menu.add (0, MENU_ABOUT, 0, _mContext.getResources() getString (R.string.mymenu).) SetIcon (R.drawable.ic_menu).;

Al crear el menú, inserte la cadena y localícela.

+0

Como sé, el menú crea solo para cada actividad debido a su ciclo de vida. No tengo ningún problema con la localización debido a la creación ..Tengo un problema cuando se ha creado el menú, luego he cambiado la configuración regional de la aplicación y quiero volver a cargar el menú (tal vez destruirlo y crearlo de nuevo. Pero no sé cómo destruirlo) – davs

+0

puede usar la preferencia compartida y cambiarlo en cada selección de la opción de menú \t \t si (preferences.getBoolean ("sonido", true)) \t \t { \t \t \t \t \t menu.add (0, MENU_SOUND, 0, "sonido") .setIcon (R.drawable.on); \t \t} \t \t otro \t \t { \t \t menu.add (0, MENU_SOUND, 0, "Sound") setIcon (R.drawable.off).; \t \t \t \t \t} – Eby

+0

No quiero crear un menú que crea erróneo. – davs