web-dev-qa-db-fra.com

utiliser les paramètres régionaux (ltr / rtl) pour la gravité dans TextView

J'ai un simple TextView qui devrait avoir Android:gravity="left" pour les paramètres régionaux du système ltr et Android:gravity="right" pour les paramètres régionaux du système rtl.

Le choix évident serait: Android:gravity="start" mais ensuite par exemple le texte anglais sera toujours aligné à gauche et l'hébreu à droite.

Voici à quoi cela ressemble avec Android:gravity="start":

Paramètres régionaux LTR:

|          לורם|   // incorrect
|test           |  // correct

Paramètres régionaux RTL:

|          לורם|  // correct
|test           |  // incorrect

c'est censé ressembler à ça:

Paramètres régionaux LTR:

|לורם           |  
|test            | 

Paramètres régionaux RTL:

|          לורם|  
|           test| 

Est-il possible de le faire sans utiliser un dossier layout-ldrtl avec un fichier xml modifié? Cela compliquerait beaucoup le développement car je devrais éditer beaucoup de fichiers de mise en page deux fois ...

edit: une solution pour API 17+ suffit. J'ai écrit les paramètres régionaux du système, mais en fait j'autorise l'utilisateur à changer la langue de l'application comme ça:

Configuration configuration = context.getResources().getConfiguration();
configuration.setLayoutDirection(selectedLocale);
configuration.locale = selectedLocale;
context.getResources().updateConfiguration(configuration, context.getResources().getDisplayMetrics());

il serait donc formidable que ce paramètre régional soit pris en compte pour le choix rtl <-> ltr.

23
agrajag

J'utilise cette solution maintenant, je préférerais une solution xml simple, mais cela semble minime jusqu'à présent:

if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {
  if (DynamicLanguage.getLayoutDirection(getContext()) == View.LAYOUT_DIRECTION_RTL) {
    this.textView.setGravity(Gravity.RIGHT);
  } else {
    this.textView.setGravity(Gravity.LEFT);
  }
}
2
agrajag

J'ai aussi eu ce problème, vous pouvez utiliser ces propriétés avec TextView

Android:textDirection="locale"
Android:textAlignment="gravity"

ou ajoutez-le simplement au thème de l'application de base dans styles.xml `

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="Android:textColorPrimary">@Android:color/white</item>
    <item name="Android:textColorSecondary">@Android:color/white</item>
    <item name="colorButtonNormal">@color/colorAccent</item>
    <item name="Android:textAlignment">gravity</item>
    <item name="Android:textDirection">locale</item>
    </style>`

Cela a fonctionné pour moi.

54
atabouraya
Android:layout_width="match_parent"    
Android:textAlignment="viewStart"

Si la vue de texte est étirée à la largeur du parent, il n'est pas nécessaire de modifier la gravité de l'élément. Il suffit d'aligner le texte au début de la vue, le texte se déplacera en position LTR ou RTL, indépendamment du contenu du texte (hébreu ou occidental).

29
Mr. Fish

Vous avez probablement besoin d'une classe TextView étendue spéciale pour cela:

public class LocaleAwareTextView extends TextView {
    public LocaleAwareTextView(Context context) {
        super(context);
        setGravity(getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL ? Gravity.RIGHT : Gravity.LEFT);
    }
    public LocaleAwareTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setGravity(getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL ? Gravity.RIGHT : Gravity.LEFT);
    }

    public LocaleAwareTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setGravity(getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL ? Gravity.RIGHT : Gravity.LEFT);
    }

}

... et utilisez cette classe dans vos mises en page. Si vous souhaitez changer les paramètres régionaux et toutes les orientations à la volée, vous devrez recharger vos mises en page.

2
Alex Cohn