2015-12-14 97 views
11

我有一个简单的TextView,对于ltr系统区域设置应该有android:gravity="left",对于rtl系统区域设置应该有android:gravity="right"在TextView中使用语言环境(ltr/rtl)来处理重力

明显的选择是:android:gravity="start",然后例如英文文本将始终左对齐,希伯来文右对齐。

下面是它的外观与android:gravity="start"

LTR区域设置:

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

RTL语言环境:

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

它应该看起来像:

LTR区域设置:

|לורם   | 
|test   | 

RTL语言环境:

|   לורם| 
|   test| 

是否有可能做到这一点不使用布局ldrtl文件夹修改xml文件?这会使开发复杂化很多,因为我将不得不编辑大量布局文件两次......

编辑: API 17+的解决方案已足够。 我写的系统区域设置,但实际上我允许用户更改应用程序语言像:

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

所以这将是巨大的,如果这个区域将被视为对RTL < - >升的选择。

+1

英文文本呈现从左到右我认为重力开始 – Bhargav

+1

是的,这正是我的问题。 RTL语言环境设置时是否有强制RTL的方法? – agrajag

+1

已尝试添加文本方向属性?但它只适用于api 17+我认为 – Bhargav

回答

1

现在,我使用这个解决方案,我宁愿一个简单的XML解决方案,但是这似乎最小至今:

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

你可能需要一个特殊的扩展的TextView类:

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

} 

...在你的布局中使用这个类。如果您想立即切换区域设置和所有方向,则需要重新加载布局。

19

我有这个问题太,你可以用TextView中使用这些属性

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

或只是将它添加到应用程序库中的主位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>` 

这对我有效。

+1

谢谢! textDirection和textAlignment对我来说几乎是完美的! (它只有17+,但对于这个问题没关系) –

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

如果文本视图拉伸到父宽度,则不需要更改元素的重力。只需将文本与视图开始对齐,文本就会移至LTR或RTL位置,与文本内容(希伯来文或西文)无关。

+1

谢谢!这是针对宽度''match_parent''并以编程方式设置rtl语言的唯一答案 – mohax

相关问题