首页 文章

在TextView中使用locale(ltr / rtl)作为重力

提问于
浏览
16

我有一个简单的TextView,对于ltr系统语言环境应该有 android:gravity="left" ,对于rtl系统语言环境应该有 android:gravity="right" .

显而易见的选择是: android:gravity="start" 但是例如英语文本将始终左对齐,希伯来语右对齐 .

以下是 android:gravity="start" 的外观:

LTR语言环境:

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

RTL语言环境:

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

它看起来应该是这样的:

LTR语言环境:

|לורם           |  
|test            |

RTL语言环境:

|          לורם|  
|           test|

是否可以在不使用带有修改过的xml文件的layout-ldrtl文件夹的情况下执行此操作?这会使开发变得很复杂,因为我必须两次编辑很多布局文件...

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

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

因此,如果将此区域设置考虑用于rtl < - > ltr选项,那将会很棒 .

4 回答

  • 2

    我也有这个问题,你可以使用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>`
    

    这对我有用 .

  • 18
    android:layout_width="match_parent"    
    android:textAlignment="viewStart"
    

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

  • 1

    您可能需要一个特殊的扩展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);
        }
    
    }
    

    ...并在布局中使用此类 . 如果要动态切换区域设置和所有方向,则需要重新加载布局 .

  • 35

    我现在正在使用这个解决方案,我更喜欢一个简单的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);
      }
    }
    

相关问题