博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android RTL布局和双向字符集显示
阅读量:5838 次
发布时间:2019-06-18

本文共 3152 字,大约阅读时间需要 10 分钟。

Android 4.1(Jelly Bean) introduced limited support for bidirectional text in TextView and EditText elements, allowing apps to display and edit text int both left-to-right(LTR) and right-to-left(RTL) scripts. Android 4.2 added full native support for RTL layouts, including layout mirroring, allowing you to deliver the same great app experience to all your users, whether their language uses a script that reads right-to-left or one that reads left-to-right.

To take advantage of RTL layout mirroring, simply make the following changes to your app.

How to use

Declare in you app manifest that your app supports RTL mirroring

android:supportsRTL="true"

Change all your app's "left/right" layout properties to new "start/end" equivalents

android:paddingLeftandroid:layout_marginLeftandroid:paddingRightandroid:layout_marginRight

to

android:paddingStartandroid:layout_marginStartandroid:paddingEndandroid:layout_marginEnd

Other APIs

For more precise control over your app UI in both LTR and RTL mode, Android 4.2 includes the following new APIs to help manage View components:

attribute for setting the direction of a component's layout.

android:layoutDirection

attribute for setting the direction of a component's text.

android:textDirection

attribute for setting the alignment of a component's text.

android:textAlignment

method for getting the Locale-specified direction`

getLayoutDirectionFromLocale()

Whether to use

View.isLayoutRtl()

the base Class Viewhas the function isLayoutRtl() to judge the layout direction

// if this class is the subclass of View, then it can useif (isLayoutRtl()) {    }

use Configuration.getLayoutDirection()

import android.content.res.Configuration;Configuration config = getResources().getConfiguratin();if (config.getLayoutDirection() == View.LAYOUT_DIRECTIN_RTL) { }

Whether to use RTL by Locale

import java.util.Collections;import java.util.HashSet;import java.util.Set;private static final Set
sRTL;static { Set
lang = new HashSet
(); private static final Set
sRTL;}static { Set
lang = new HashSet
(); lang.add("ar"); lang.add("dv"); lang.add("fa"); lang.add("ha"); lang.add("he"); lang.add("iw"); lang.add("ji"); lang.add("ps"); lang.add("ur"); lang.add("yi"); sRTL = Collections.unmodifiableSet(lang);}public static boolean isTextRTL(Locale locale) { return sRTL.contains(locale.getLanguage());}// usageageisTextRTL(Locale.getDefault());

Create custome versions of layout, drawables and other resources fro display when a right-to-left is in use

res/  drawable-hdpi // Default  drawable-ldltr-hdpi // LTR  drawable-ldrtl-hpid // RTL

Support BiDi(双向字符集)显示

参考

双向字符集(BiDi)通常是指文字可以从左到有(LTR)和从右到左(RTL)双向书写的文字.

比如本国文字是从右向左(乌尔都语, 阿拉伯语)与英语混排.

双向字符集语言处理算法

在 BiDi 中,所有的非标点符号被称为强字符。而标点符号既可以是从左向右 LTR 也可以是从右向左 RTL。因为不含任何的方向信息,所以被称为弱字符

  • 标点符号放在两段有相同方向文字的中间,标点符号将继承相同的方向

  • 标点符号放在两段有不同方向的文字中间,标点符号将继承全局方向

  • 一个弱字符紧挨着一个弱字符,BiDi 算法将根据最近相邻的“强”字符来决定字符方向。在某些情况下,这会导致非预期的情况出现。为了纠正错误,需要使用伪强字符RLM(\u200E)或者LRM(\u200F)插入到文字中间来调整字符的显示。

显然RLM, 表示从右到左, LRM从左到右. 使用时, 在要需要的的伪强字符后添加RLM或者LRM

References

[1]

[2]
[3]
[4]

转载地址:http://qkncx.baihongyu.com/

你可能感兴趣的文章
关于k-means聚类算法的matlab实现
查看>>
Git分支2
查看>>
一键安装Gitlab后的备份、迁移与恢复
查看>>
因为本人工作繁忙,精力有限,本博客停止更新。有兴趣的博友可以关注我在CSDN上的主博客...
查看>>
三元表达式,推导式,递归,匿名函数,内置函数
查看>>
SQL server查看触发器是否被禁用
查看>>
[C++基础]在构造函数内部调用构造函数
查看>>
跟随我在oracle学习php(8)
查看>>
Spring 3.1.0 Hibernate 3.0 Eclipse Spring WEB例子
查看>>
使用Unicode写文本文件:一个简单类的示例
查看>>
UVA-10212 The Last Non-zero Digit. 分解质因子+容斥定理
查看>>
求两个集合的交集,并集,差集
查看>>
[Laravel] Laravel的基本数据库操作部分
查看>>
Kotlin的语法糖(一)基础篇
查看>>
OkHttp源码分析
查看>>
让你的app体验更丝滑的11种方法!冲击手机应用榜单Top3指日可待
查看>>
windows kernel exploitation基础教程
查看>>
NS_OPTIONS枚举的用法
查看>>
java9系列(九)Make G1 the Default Garbage Collector
查看>>
(NO.00003)iOS游戏简单的机器人投射游戏成形记(四)
查看>>