web-dev-qa-db-fra.com

Android: modifier par programmation les instructions de mise en page de l'application

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

 enter image description here

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? 

25
Hamidreza Salehi

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());
33
Afshin

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);
}
2
Pavel Kataykin

Changer la mise en page entière 

 LinearLayout linrtl=(LinearLayout)findViewById(R.id.linrtl);
 linrtl.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
2
Syed Danish Haider

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.

0
box

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.

0
SimK