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.
Vous devez vous connecter pour publier un commentaire.
Par le biais de la question d'origine n'est pas exactement sur les paramètres régionaux de lui-même tous les autres paramètres régionaux des questions relatives à la référence à celui-ci. C'est pourquoi je tenais à préciser la question ici. J'ai utilisé cette question comme un point de départ pour mes propres paramètres régionaux du code de commutation et a trouvé que la méthode n'est pas tout à fait correct. Cela fonctionne, mais seulement jusqu'à ce que toute modification de la configuration (par exemple, la rotation de l'écran) et uniquement à cette Activité. Jouer avec un code pendant un moment j'ai fini avec l'approche suivante:
J'ai étendu android.app.Application et ajouté le code suivant:
Ce code garantit que chaque Activité de la coutume locale définie et il ne sera pas réinitialisé sur la rotation et d'autres événements.
J'ai aussi passé beaucoup de temps à essayer de faire la modification de préférences pour être appliquée immédiatement, mais n'a pas réussi: la langue a été modifiée correctement sur l'Activité de redémarrer, mais le nombre de formats et d'autres propriétés de paramètres régionaux n'ont pas été appliquées jusqu'au redémarrage de l'application.
Changements à
AndroidManifest.xml
N'oubliez pas d'ajouter
android:configChanges="layoutDirection|locale"
pour chaque activité à AndroidManifest, ainsi que laandroid:name=".MyApplication"
à la<application>
élément.MyApplication
à faire appliquer automatiquement les paramètres régionaux des changements. DansAndroidManifest.xml
,<application android:name=".MYApplication" ~~
est nécessaire. Après cela, que le code sera appelé à chaque Activités.config
etnewConfig
). Vous devriez faire une copie avecconfig = new Configuration(config);
premier. Je viens de passer une heure de débogage ce code avant de trouver le problème (il était à l'origine de l'activité de flash à l'infini).onConfigurationChanged
deApplication
est appelé que si je la rotation de l'écran. des idées ?updateConfiguration()
fonctionne, donc parfois, votre Activité sera affiché dans 2 langues différentes (notamment dans les Dialogues). Plus d'infos: stackoverflow.com/questions/39705739/...Après une bonne nuit de sommeil, j'ai trouvé la réponse sur le Web (une simple recherche Google sur la ligne suivante "
getBaseContext().getResources().updateConfiguration(mConfig, getBaseContext().getResources().getDisplayMetrics());
"), elle est ici :texte du lien
=> ce lien montre également
screenshots
de ce qui se passe !De la densité a été la question ici, j'avais besoin de cette dans le AndroidManifest.xml
Le plus important est le android:anyDensity =" true ".
N'oubliez pas d'ajouter le texte suivant dans la
AndroidManifest.xml
pour chaque activité (Android 4.1 et ci-dessous):Cette version est nécessaire lorsque vous générez pour Android 4.2 (API level 17) explication ici:
activity.recreate()
Dans Android M, la solution ne fonctionne pas. J'ai écrit une classe d'aide à réparer ce qui vous devez appeler à partir de votre Application de classe et de toutes les Activités (je suggère la création d'un BaseActivity et ensuite faire toutes les Activités héritent de celui-ci.
Note: Cela permettra également d'appuyer correctement RTL l'orientation de la page.
De la classe Helper:
Application:
BaseActivity:
LocaleUtils.setLocale(new Locale("de"));
n'est pas assez, mais si je demande aussiLocaleUtils.updateConfig(getActivity());
- je obtenir uneIllegalStateException: getResources() has already been called
. Des idées?BaseActivity()
appel du constructeursuper()
?<application android:name=".App">
dans le manifeste? Que diriez-vous d'android:configChanges="layoutDirection|locale"
pour chaque activité dans le manifeste?application android:name=".App"
autrement application ne pas utiliser le langage du partage des préférences de démarrage. J'ai également ajoutéandroid:configChanges="layoutDirection|locale"
dans les paramètres de l'activité où je changer la langue.C'est pour mon commentaire sur Andrey réponse mais je ne peux pas inclure du code dans les commentaires.
Est vous activité de préférence être appelés à partir de votre activité principale? vous avez pu en reprendre...
activity.recreate()
recreate()
méthode pour utiliserrecreate()
en place derefresh()
dans votre code. Cela permettra d'économiser votre 3 ligne de code dansrefresh()
méthodeJe ne pouvais pas utilisées android:anyDensity="true", parce que les objets dans mon jeu serait positionné complètement différent... semble que cela aussi fait le truc:
code Locale.setDefault(mLocale); Configuration config = getBaseContext().getResources().getConfiguration(); if (!config.locale.equals(mLocale)) { config.locale = mLocale; getBaseContext().getResources().updateConfiguration(config, null); }
Si vous voulez un effet sur le menu d'options pour modifier les paramètres régionaux immédiatement.Vous devez faire comme ceci.
onMenuOpened
doit être appelé qu'une seule fois, après le changement de paramètres régionaux.