方向改变后 android 加载 "layout-ldltr" 布局是否 "layout-ldrtl" 存在错误?
Is android bug in load "layout-ldltr" layout against "layout-ldrtl" after orientation changed?
在我的项目中,我必须为 Right-To-Left
和 Left-To-Right
语言创建 layout-ldltr
和 layout-ldrtl
布局。
我启动了 Right-To-Left 语言的应用程序,一切都很好。
但是当方向改变时,android 加载 layout-ldltr
布局反对 layout-ldrtl
,尽管当前 Locale
设置为 RTL 语言!!!
如何解决这个问题?
在AndroidManifest.xml
<application
android:name=".QuranApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
在layout-ldrtl\activity_main.xml
中:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layoutDirection="rtl">
<include layout="@layout/toolbar" />
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:layoutDirection="rtl">
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="rtl"/>
<include
layout="@layout/list_view"
android:layout_width="@dimen/drawer_width"
android:layout_height="match_parent"
android:layout_gravity="start" />
</android.support.v4.widget.DrawerLayout>
更新
@JohanShogun 发表评论后,我将 android:layoutDirection="rtl"
更改为 android:layoutDirection="locale"
,大多数项目的问题都已解决。
在第一张照片中,所有元素都显示得很好:
在横向模式下,StickyListHeader list view 中的 header 项目中,粘在屏幕顶部,Android 使用 ltr 布局!:
如果您有一个包含 layout-land 的文件夹,它将取代 layout-ldrtl 等。您可能需要为 layout-land-ldrtl 等创建文件夹。
另一种处理从右到左和从左到右布局的方法是保留一个布局文件,该文件是为两个版本而编写的。
在 LinearLayout 等上有一个属性:
android:layoutDirection
您可以将其设置为 "Locale" 的值,您的水平布局将翻转顺序。
不使用 align_left/align_right
和 gravity_left/gravity_right
,而是使用 align_start/align_end
和 gravity_start/gravity_end
(适用于所有 left/right
属性)。开始和结束标签取决于布局方向。如果用户的区域设置为 ltr
start 位于左侧 且 end 位于右侧 ,如果用户的区域设置为 rtl
起点在右边,终点在左边。
我个人更喜欢使用为 rtl
和 ltr
编写的布局文件,而不是单独的布局文件,如果保留不同的文件,很容易错过一个版本的更新,结果糟糕的用户体验。
同时将布局移动到布局文件夹(删除 "-ldrtl"
),然后将所有 android:layoutDirection="rtl"
更改为 android:layoutDirection="locale"
。
在我的项目中,我必须为 Right-To-Left
和 Left-To-Right
语言创建 layout-ldltr
和 layout-ldrtl
布局。
我启动了 Right-To-Left 语言的应用程序,一切都很好。
但是当方向改变时,android 加载 layout-ldltr
布局反对 layout-ldrtl
,尽管当前 Locale
设置为 RTL 语言!!!
如何解决这个问题?
在AndroidManifest.xml
<application
android:name=".QuranApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
在layout-ldrtl\activity_main.xml
中:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layoutDirection="rtl">
<include layout="@layout/toolbar" />
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:layoutDirection="rtl">
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="rtl"/>
<include
layout="@layout/list_view"
android:layout_width="@dimen/drawer_width"
android:layout_height="match_parent"
android:layout_gravity="start" />
</android.support.v4.widget.DrawerLayout>
更新
@JohanShogun 发表评论后,我将 android:layoutDirection="rtl"
更改为 android:layoutDirection="locale"
,大多数项目的问题都已解决。
在第一张照片中,所有元素都显示得很好:
在横向模式下,StickyListHeader list view 中的 header 项目中,粘在屏幕顶部,Android 使用 ltr 布局!:
如果您有一个包含 layout-land 的文件夹,它将取代 layout-ldrtl 等。您可能需要为 layout-land-ldrtl 等创建文件夹。
另一种处理从右到左和从左到右布局的方法是保留一个布局文件,该文件是为两个版本而编写的。
在 LinearLayout 等上有一个属性:
android:layoutDirection
您可以将其设置为 "Locale" 的值,您的水平布局将翻转顺序。
不使用 align_left/align_right
和 gravity_left/gravity_right
,而是使用 align_start/align_end
和 gravity_start/gravity_end
(适用于所有 left/right
属性)。开始和结束标签取决于布局方向。如果用户的区域设置为 ltr
start 位于左侧 且 end 位于右侧 ,如果用户的区域设置为 rtl
起点在右边,终点在左边。
我个人更喜欢使用为 rtl
和 ltr
编写的布局文件,而不是单独的布局文件,如果保留不同的文件,很容易错过一个版本的更新,结果糟糕的用户体验。
同时将布局移动到布局文件夹(删除 "-ldrtl"
),然后将所有 android:layoutDirection="rtl"
更改为 android:layoutDirection="locale"
。