除了针对所有RTL语言测试语言代码之外,还有办法识别RTL(从右到左)语言吗?
由于API 17+为RTL和LTR提供了多种资源,我认为应该有一种方法,至少从API 17开始。
答案 0 :(得分:68)
从Configuration.getLayoutDirection()获取
Configuration config = getResources().getConfiguration();
if(config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
//in Right To Left layout
}
答案 1 :(得分:50)
@ cyanide的答案有正确的方法,但是一个关键的错误。
Character.getDirectionality返回Bi-directional (bidi) character type。 从左到右的文本是可预测的类型L,从右到左也是可预测的类型R.但是,阿拉伯文本返回另一种类型,类型为AL。
我添加了对类型R和类型AL的检查,然后手动测试Android附带的每种RTL语言:希伯来语(以色列),阿拉伯语(埃及)和阿拉伯语(以色列)。
正如您所看到的,这会遗漏其他从右到左的语言,因此我担心Android会添加这些语言时,可能会出现类似的问题,而且可能不会立即注意到。
所以我手动测试了每种RTL语言。
所以看起来这应该很有效:
public static boolean isRTL() {
return isRTL(Locale.getDefault());
}
public static boolean isRTL(Locale locale) {
final int directionality = Character.getDirectionality(locale.getDisplayName().charAt(0));
return directionality == Character.DIRECTIONALITY_RIGHT_TO_LEFT ||
directionality == Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC;
}
感谢@cyanide向我发送了正确的方向!
答案 2 :(得分:20)
如果您使用的是支持库,则可以执行以下操作:
if (ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_RTL) {
// The view has RTL layout
} else {
// The view has LTR layout
}
答案 3 :(得分:13)
您可以使用支持库中的TextUtilsCompat。
TextUtilsCompat.getLayoutDirectionFromLocale(locale)
答案 4 :(得分:9)
有一种非常简单的方法可以检查视图的布局方向,但它会在API 17之前的设备上回退到LTR:
ViewUtils.isLayoutRtl(View view);
ViewUtils类与support v7库捆绑在一起,因此如果您使用appcompat库,它应该已经可用。
答案 5 :(得分:8)
我收集了很多信息,最后制作了自己的,希望完整的RTLUtils课程。
它允许知道给定的区域设置或视图是否是RTL' : - )强>
package com.elementique.shared.lang;
import java.util.Collections;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import android.support.v4.view.ViewCompat;
import android.view.View;
public class RTLUtils
{
private static final Set<String> RTL;
static
{
Set<String> lang = new HashSet<String>();
lang.add("ar"); // Arabic
lang.add("dv"); // Divehi
lang.add("fa"); // Persian (Farsi)
lang.add("ha"); // Hausa
lang.add("he"); // Hebrew
lang.add("iw"); // Hebrew (old code)
lang.add("ji"); // Yiddish (old code)
lang.add("ps"); // Pashto, Pushto
lang.add("ur"); // Urdu
lang.add("yi"); // Yiddish
RTL = Collections.unmodifiableSet(lang);
}
public static boolean isRTL(Locale locale)
{
if(locale == null)
return false;
// Character.getDirectionality(locale.getDisplayName().charAt(0))
// can lead to NPE (Java 7 bug)
// https://bugs.openjdk.java.net/browse/JDK-6992272?page=com.atlassian.streams.streams-jira-plugin:activity-stream-issue-tab
// using hard coded list of locale instead
return RTL.contains(locale.getLanguage());
}
public static boolean isRTL(View view)
{
if(view == null)
return false;
// config.getLayoutDirection() only available since 4.2
// -> using ViewCompat instead (from Android support library)
if (ViewCompat.getLayoutDirection(view) == View.LAYOUT_DIRECTION_RTL)
{
return true;
}
return false;
}
}
答案 6 :(得分:7)
如果要检查低于17的API
,可以这样检查boolean isRightToLeft = TextUtilsCompat.getLayoutDirectionFromLocale(Locale
.getDefault()) == ViewCompat.LAYOUT_DIRECTION_RTL;
OR或适用于API 17或以上
boolean isRightToLeft = TextUtils.getLayoutDirectionFromLocale(Locale
.getDefault()) == ViewCompat.LAYOUT_DIRECTION_RTL;
答案 7 :(得分:3)
为了在LTR和RTL模式下更精确地控制您的应用UI,Android 4.2包含以下新API以帮助管理View组件:
android:layoutDirection — attribute for setting the direction of a component's layout.
android:textDirection — attribute for setting the direction of a component's text.
android:textAlignment — attribute for setting the alignment of a component's text.
getLayoutDirectionFromLocale() — method for getting the Locale-specified direction
因此getLayoutDirectionFromLocale()可以帮助你。请参阅此处的示例代码:https://android.googlesource.com/platform/frameworks/base.git/+/3fb824bae3322252a68c1cf8537280a5d2bd356d/core/tests/coretests/src/android/util/LocaleUtilTest.java
答案 8 :(得分:2)
感谢所有人。
如果您查看LayoutUtil.getLayoutDirectionFromLocale()
的代码(并且我还假设Confuiguration.getLayoutDirection()
),最终会使用Character.getDirectionality
分析区域设置显示名称的起始字母。< / p>
由于Character.getDirectionality
来自Android 1,因此以下代码将与所有Android版本兼容(即使是那些,也不正确支持RTL:)):
public static boolean isRTL() {
return isRTL(Locale.getDefault());
}
public static boolean isRTL(Locale locale) {
return
Character.getDirectionality(locale.getDisplayName().charAt(0)) ==
Character.DIRECTIONALITY_RIGHT_TO_LEFT;
}
答案 9 :(得分:2)
构建库时,您还需要使用
检查应用程序是否支持RTL(getApplicationInfo().flags &= ApplicationInfo.FLAG_SUPPORTS_RTL) != 0
当应用程序在RTL语言环境中运行时,但它没有在清单android:supportsRtl="true"
中声明,那么它在LTR模式下运行。
答案 10 :(得分:1)
这适用于所有SDKS:
private boolean isRTL() {
Locale defLocale = Locale.getDefault();
return Character.getDirectionality(defLocale.getDisplayName(defLocale).charAt(0)) == Character.DIRECTIONALITY_RIGHT_TO_LEFT;
}
答案 11 :(得分:1)
只需使用此代码:
public static boolean isRTL() {
return isRTL(Locale.getDefault());
}
public static boolean isRTL(Locale locale) {
final int directionality = Character.getDirectionality(locale.getDisplayName().charAt(0));
return directionality == Character.DIRECTIONALITY_RIGHT_TO_LEFT ||
directionality == Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC;
}
if (isRTL()) {
// The view has RTL layout
}
else {
// The view has LTR layout
}
这适用于所有Android API级别。
答案 12 :(得分:0)
Native RTL support in Android 4.2
public static ComponentOrientation getOrientation(Locale locale)
{
// A more flexible implementation would consult a ResourceBundle
// to find the appropriate orientation. Until pluggable locales
// are introduced however, the flexiblity isn't really needed.
// So we choose efficiency instead.
String lang = locale.getLanguage();
if( "iw".equals(lang) || "ar".equals(lang)
|| "fa".equals(lang) || "ur".equals(lang) )
{
return RIGHT_TO_LEFT;
} else {
return LEFT_TO_RIGHT;
}
}
答案 13 :(得分:0)
由于英语设备支持RTL,您可以在MainActivity中使用此代码将设备语言更改为英语,而不需要“支持RTL”代码。
{{1}}
答案 14 :(得分:0)
您可以使用Bidi检测字符串是否为RTL / LTR。示例:
import java.text.Bidi;
Bidi bidi = new Bidi( title, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT );
if( bidi.isLeftToRight() ) {
// it's LTR
} else {
// it's RTL
}
答案 15 :(得分:0)
您可以轻松地使用它:
if (getWindow().getDecorView().getLayoutDirection()== View.LAYOUT_DIRECTION_RTL) {
// The view has RTL layout
} else {
// The view has LTR layout
}