Modification des paramètres Régionaux au sein de l'application elle-même

Mes utilisateurs peuvent modifier les paramètres Régionaux au sein de l'application (ils pourront garder leurs paramètres du téléphone en anglais, mais lire le contenu de mon appli en français, en néerlandais ou en toute autre langue ...)

Pourquoi est-ce fonctionne parfaitement bien en 1.5/1.6 mais PAS dans la version 2.0 plus ???

@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...

Le problème est que le MENU "rétrécit" de plus en plus à chaque fois que l'utilisateur passe par les lignes de code ci-dessus ...

C'est le Menu qui obtient rétréci:

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

Que dois-je faire de l'API de Niveau 5 pour que cela fonctionne de nouveau ?

VOICI LE CODE COMPLET SI VOUS SOUHAITEZ TESTER CE :

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

ET VOICI LE MANIFESTE :

<?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>

C'EST CE QUE J'AI TROUVÉ :

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

=> ÇA marche très bien ...

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

=> Menu se rétrécit à chaque fois que vous modifiez les paramètres régionaux !!!

que je veux garder mon application accessible pour les utilisateurs de la version 1.5, que dois-je faire ??

  • Qu'entendez-vous par "rétrécit"?
  • il devient de plus en plus petits à chaque fois. je devrais peut-être utiliser autre chose que getBaseContext ?
  • C'est peut-être pas ces lignes à créer le problème que lorsque je fais une très d'application de base de faire juste le changer dans les paramètres Régionaux, je n'ai pas la même "rétrécissement du menu". Je pensais que c'était peut-être parce que mon Activité était en fait un TabActivity, mais même avec ça, je ne peux pas re-créer le problème. Je vais avoir à investiguer davantage quelle est la cause exacte de ce bug... ne cherchez pas plus loin. Je vais poster la réponse ici quand je le trouve. Cheers, H.
  • J'ai édité mon premier post, en donnant un exemple sur la façon de créer le problème. Et j'ai remarqué en fait que lorsque je change la ligne <uses-sdk android:minSdkVersion="5" /> "3" ... en effet le problème apparaît !
  • Vous pouvez utiliser la bibliothèque suivante, qui fournit la liste des langues, de la préférence pour votre écran des paramètres, et remplace la langue de votre demande: github.com/delight-im/Android-Languages
  • Également similaire: stackoverflow.com/questions/23348954/android-get-device-locale
  • J'ai déjà répondu à cette question dans un autre fil, vérifiez ici.

InformationsquelleAutor Hubert | 2010-02-15