2015-12-14 22 views
11

Ho un semplice TextView che dovrebbe avere android:gravity="left" per le locali del sistema di ltr e android:gravity="right" per le versioni locali del sistema rtl.usa locale (ltr/rtl) per gravità in TextView

La scelta più ovvia sarebbe: android:gravity="start" ma poi ad es. il testo inglese sarà sempre allineato a sinistra ed ebraico allineato a destra.

Ecco come appare con android:gravity="start":

LTR locale:

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

RTL locale:

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

si suppone a guardare come che:

LTR locale:

|לורם   | 
|test   | 

locale RTL:

|   לורם| 
|   test| 

E 'possibile farlo senza l'utilizzo di una cartella di layout ldrtl con un file XML modificato? Ciò complicherebbe molto lo sviluppo perché dovrei modificare molti file di layout due volte ...

modifica: una soluzione per API 17+ è sufficiente. ho scritto locale del sistema, ma in realtà sto che permette all'utente di cambiare la lingua app del genere:

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

quindi sarebbe bello se questo locale sarebbe considerato per il rtl < -> scelta litri.

+1

Il testo in inglese viene visualizzato da sinistra a destra penso con gravità iniziale – Bhargav

+1

sì, esattamente questo è il mio problema. C'è un modo per forzare RTL quando è impostata la localizzazione RTL? – agrajag

+1

hai provato ad aggiungere l'attributo textdirection? ma è solo per api 17+ penso – Bhargav

risposta

1

sto usando questa soluzione ora, io preferirei una soluzione XML semplice, ma questo sembra il minimo finora:

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

probabilmente avete bisogno di una classe speciale TextView estesa per che:

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

} 

... e usare questa classe nel vostro layout. Se vuoi cambiare le impostazioni internazionali e tutti gli orientamenti al volo, dovrai ricaricare i tuoi layout.

19

ho avuto anche questo problema, è possibile utilizzare queste proprietà con la TextView

android:textDirection="locale" 
android:textAlignment="gravity" 

o semplicemente aggiungerla al tema App Base in 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>` 

Questo ha funzionato per me.

+1

Grazie! textDirection e textAlignment funziona quasi perfettamente per me! (È solo 17+ ma va bene per questa domanda) –

12
android:layout_width="match_parent"  
android:textAlignment="viewStart" 

Se la visualizzazione del testo è estesa alla larghezza genitore, non è necessario modificare la gravità dell'elemento. Basta allineare il testo all'inizio della visualizzazione, il testo si sposterà in posizione LTR o RTL, indipendentemente dal contenuto del testo (ebraico o occidentale).

+1

Grazie! Questa è l'unica risposta che ha funzionato in caso di 'match_parent' per la larghezza e impostato in modo programmatico per la lingua rtl – mohax