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

agr*_*jag 19 layout android right-to-left

我有一个简单的TextView,它应该android:gravity="left"用于ltr系统区域设置和android:gravity="right"rtl系统区域设置.

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

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

LTR语言环境:

|          ????|   // incorrect
|test           |  // correct
Run Code Online (Sandbox Code Playgroud)

RTL语言环境:

|          ????|  // correct
|test           |  // incorrect
Run Code Online (Sandbox Code Playgroud)

它看起来应该是这样的:

LTR语言环境:

|????           |  
|test            | 
Run Code Online (Sandbox Code Playgroud)

RTL语言环境:

|          ????|  
|           test| 
Run Code Online (Sandbox Code Playgroud)

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

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

Configuration configuration = context.getResources().getConfiguration();
configuration.setLayoutDirection(selectedLocale);
configuration.locale = selectedLocale;
context.getResources().updateConfiguration(configuration, context.getResources().getDisplayMetrics());
Run Code Online (Sandbox Code Playgroud)

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

ata*_*aya 46

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

android:textDirection="locale"
android:textAlignment="gravity"
Run Code Online (Sandbox Code Playgroud)

或者只是将它添加到styles.xml中的Base App主题`

<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>`
Run Code Online (Sandbox Code Playgroud)

这对我有用.

  • `textDirection` 参数会覆盖默认行为,即根据第一个强字符确定文本方向。这可能会导致意外的错误,例如“Hello!” 在 RTL 布局方向上显示为“!Hello”。`textAlignment` 参数没有任何作用,因为它是默认行为。如果您不完全理解其含义,那么在使用它之前要小心,在没有适当考虑的情况下覆盖系统的默认行为总是很危险的。 (2认同)

Mr.*_*ish 27

android:layout_width="match_parent"    
android:textAlignment="viewStart"
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢!这是在“match_parent”宽度和以编程方式设置 rtl 语言的情况下唯一有效的答案 (3认同)

agr*_*jag 3

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