背景
可以使用以下方法获取当前的语言环境方向:
val isRtl=TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault()) == ViewCompat.LAYOUT_DIRECTION_RTL
如果开发人员设置了它,也可以获取视图的布局方向:
val layoutDirection = ViewCompat.getLayoutDirection(someView)
问题
视图的默认 layoutDirection 不基于其语言环境。它实际上是LAYOUT_DIRECTION_LTR。
当您将设备的区域设置从 LTR(从左到右)区域设置(如英语)更改为 RTL(从右到左)区域设置(如阿拉伯语或希伯来语)时,视图将相应对齐,但您的值默认情况下,视图将保持 LTR ...
这意味着给定一个视图,我看不出如何确定它经过的正确方向。
我试过的
我做了一个简单的 POC。它有一个带有 TextView 的 LinearLayout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/linearLayout" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:gravity="center_vertical" tools:context=".MainActivity">
<TextView
android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="Hello World!"/>
</LinearLayout>
在代码中,我写了语言环境和视图的方向:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val isRtl = TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault()) == ViewCompat.LAYOUT_DIRECTION_RTL
Log.d("AppLog", "locale direction:isRTL? $isRtl")
Log.d("AppLog", "linearLayout direction:${layoutDirectionValueToStr(ViewCompat.getLayoutDirection(linearLayout))}")
Log.d("AppLog", "textView direction:${layoutDirectionValueToStr(ViewCompat.getLayoutDirection(textView))}")
}
fun layoutDirectionValueToStr(layoutDirection: Int): String =
when (layoutDirection) {
ViewCompat.LAYOUT_DIRECTION_INHERIT -> "LAYOUT_DIRECTION_INHERIT"
ViewCompat.LAYOUT_DIRECTION_LOCALE -> "LAYOUT_DIRECTION_LOCALE"
ViewCompat.LAYOUT_DIRECTION_LTR -> "LAYOUT_DIRECTION_LTR"
ViewCompat.LAYOUT_DIRECTION_RTL -> "LAYOUT_DIRECTION_RTL"
else -> "unknown"
}
}
结果是,即使我切换到 RTL 语言环境(希伯来语 - עברית),它也会在日志中打印:
locale direction:isRTL? true
linearLayout direction:LAYOUT_DIRECTION_LTR
textView direction:LAYOUT_DIRECTION_LTR
当然,根据当前的语言环境,textView 与正确的一侧对齐:
如果它可以像我想象的那样工作(默认为 LAYOUT_DIRECTION_LOCALE),则此代码将检查视图是否处于 RTL 中:
fun isRTL(v: View): Boolean = when (ViewCompat.getLayoutDirection(v)) {
View.LAYOUT_DIRECTION_RTL -> true
View.LAYOUT_DIRECTION_INHERIT -> isRTL(v.parent as View)
View.LAYOUT_DIRECTION_LTR -> false
View.LAYOUT_DIRECTION_LOCALE -> TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault()) == ViewCompat.LAYOUT_DIRECTION_RTL
else -> false
}
但它不能,因为 LTR 是默认的,但它甚至不重要......
所以这段代码是错误的。
问题
怎么可能默认情况下,方向是 LTR,但实际上它会向右对齐,以防语言环境发生变化?
无论开发人员为它设置(或未设置)什么,我如何检查给定视图的方向是 LTR 还是 RTL ?