Comment puis-je changer la direction de la présentation de l'application en RTL? Je suis en train d'écrire une application pour laquelle l'utilisateur doit sélectionner sa langue lors du premier lancement. Android:supportsRtl="true"
à la AndroidManifest
et Android:layoutDirection="rtl"
pour chaque mise en page, mais cette approche pose certains problèmes, comme ci-dessous:
L’un des problèmes est que lorsque je change de direction pour RTL, l’icône ActionBar
de la maison ou le bouton de navigation (lorsque la position accueil est activée) reste LRT et se déplace simplement vers la droite.
J'ai aussi essayé de changer de direction par programme et le résultat était le même:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
getWindows().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
}
Existe-t-il un moyen de forcer toutes les activités à devenir simultanément RTL ou devrions-nous définir la direction de chaque activité séparément?
Vous pouvez utiliser ce morceau de code pendant que minSdk> = 17 de votre application.
J'ai utilisé fa
pour Farsi
, vous pouvez utiliser une autre langue rtl.
Configuration configuration = getResources().getConfiguration();
configuration.setLayoutDirection(new Locale("fa"));
getResources().updateConfiguration(configuration, getResources().getDisplayMetrics());
Essayez le code ci-dessous si vous voulez changer de langue dans l'application et changer les directions dans les vues et les ressources sur la disposition active:
// set Persian language in the app
setLanguage(context, "fa");
public void setLanguage(Context c, String lang) {
Locale localeNew = new Locale(lang);
Locale.setDefault(localeNew);
Resources res = c.getResources();
Configuration newConfig = new Configuration(res.getConfiguration());
newConfig.locale = localeNew;
newConfig.setLayoutDirection(localeNew);
res.updateConfiguration(newConfig, res.getDisplayMetrics());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
newConfig.setLocale(localeNew);
c.createConfigurationContext(newConfig);
}
}
De plus, après avoir changé la langue, vous devez changer les directions pour les vues déjà créées sur la disposition active. Vous pouvez le faire avec ce code:
if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) == ViewCompat.LAYOUT_DIRECTION_RTL) {
view.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
} else {
view.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
}
Changer la mise en page entière
LinearLayout linrtl=(LinearLayout)findViewById(R.id.linrtl);
linrtl.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
Le bouton Précédent reste en mode LTR, car il ne possède qu'une seule ressource, une flèche pointant vers la gauche. Vous devez spécifier un nouveau dossier de ressources, par exemple drawable-ldrtl-hdpi, et placer la même icône qui pointe directement dans ce dossier.
J'ai également ce problème. Je constate que si la largeur de votre vue est définie par MATCH_PARENT
, vous devez définir la gravité de la vue avec Gravity.LEFT
dansLTRmodèle et définir la gravité de la vue avec Gravity.RIGHT
dans le modèle RTL.