在 TextView 中使用区域设置 (ltr/rtl) 作为引力
use locale (ltr/rtl) for gravity in TextView
我有一个简单的 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 选择考虑此语言环境,那就太好了。
您可能需要一个特殊的扩展 TextView class:
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);
}
}
... 并在您的布局中使用此 class。如果您想即时切换语言环境和所有方向,您将需要重新加载布局。
我现在正在使用这个解决方案,我更喜欢一个简单的 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);
}
}
我也有这个问题,您可以将这些属性与 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>`
这对我有用。
android:layout_width="match_parent"
android:textAlignment="viewStart"
如果文本视图被拉伸到父宽度,则无需更改元素的重力。只需将文本与视图起点对齐,文本将移动到 LTR 或 RTL 位置,与文本内容(希伯来文或西方文)无关。
我有一个简单的 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 选择考虑此语言环境,那就太好了。
您可能需要一个特殊的扩展 TextView class:
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);
}
}
... 并在您的布局中使用此 class。如果您想即时切换语言环境和所有方向,您将需要重新加载布局。
我现在正在使用这个解决方案,我更喜欢一个简单的 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);
}
}
我也有这个问题,您可以将这些属性与 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>`
这对我有用。
android:layout_width="match_parent"
android:textAlignment="viewStart"
如果文本视图被拉伸到父宽度,则无需更改元素的重力。只需将文本与视图起点对齐,文本将移动到 LTR 或 RTL 位置,与文本内容(希伯来文或西方文)无关。