我最近一直在研究支持RTL文本和布局。根据{{3}},android会自动为API-17支持并切换layoutDirection
,这就是添加Start
和End
重力的原因。现在的问题是如何以类似的方式为API-17之前提供支持。
此问题之前已被多次询问,一般解决方案是检查区域设置或文本,然后根据需要设置重力。至少它比this post之类的解决方案需要更少的工作量。
我现在重新审视此问题的原因是因为我注意到support-v7-appcompat
的更新,现在包含AppCompatTextView
和LinearLayoutCompat
等类。据我所知,这些支持库的重点是模仿以后Android版本的默认行为。
我创建了一个布局来测试它。
layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#80ccffee">
<android.support.v7.widget.AppCompatTextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
当我给textview
一个阿拉伯字符串时,它被正确检测为RTL文本并在API-17设备上自动右对齐,其中不同时发生API-10设备。我可能误解了AppCompatTextView
的目的,但GravityCompat.START
的存在向我建议它的意图是解决方法。
然后我将textview
包裹在LinearLayoutCompat
中,而不是希望布局的方向会影响它,但没有运气。
所以我的问题是:新的AppCompat更新中是否有一种机制可用于支持RTL而无需在代码中设置每个TextView的重力?
答案 0 :(得分:0)
是的,有!
您可以通过覆盖主题的默认属性来实现所需的目标,如下所述:
转到res->值-> styles.xml
像这样覆盖属性:
<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
<item name="android:textDirection">rtl</item>
<item name="android:gravity">start</item>
</style>