EditText属性运用之适配RTL语言和LTR语言的输入习惯

本文围绕EditText的使用,描述如何在不同的情况下适配RTL和和LTR语言的输入状态。

安卓原生的textDirection属性对应的locale值,往往只能适配系统的语言,而并不能识别输入法语言,所以仅使用此属性就会发生以下现象:

1.系统RTL语言,不论输入法是什么语言:

【输入框空白区域】【光标】【已输入内容】

2.系统LTR语言,不论输入法是什么语言:

【已输入内容】【光标】【输入框空白区域】

这样的效果对应代码如下:

java 复制代码
editText.setTextDirection(View.TEXT_DIRECTION_LOCALE);
editText.setGravity(Gravity.START);

这就导致了一个问题,当系统语言是RTL,而输入法语言用户想输入LTR语言时,这样的设计是与用户习惯不符的,在体验上会比较难受。

看到这里的时候,可能大部分人的想法是认为原生的就足够使用了,对这种冷门问题也感到职业疲乏,认为是设计如此,但,解决问题和热爱学习是开发者的本能,何况解决这种问题也非常简单, 我希望你愿意继续读下去。

对于上面那种情况,我们更希望的情况是这样:

1.系统RTL语言,输入法RTL语言:

【输入框空白区域】【光标】【已输入内容】

1.1系统RTL语言,输入法LTR语言:

【输入框空白区域】【已输入内容】【光标】

2.系统LTR语言,输入法LTR语言:

【已输入内容】【光标】【输入框空白区域】

2.1系统LTR语言,输入法RTL语言:

【光标】【已输入内容】【输入框空白区域】

也就是输入内容根据输入的文本语言选择显示在光标的哪一侧,如果输入法是LTR语言,比如中文,

这样不仅在显示上满足了系统RTL/LTR语言的特性,即输入文本既可以根据语言特性显示在文本框的最右侧/最左侧(这根据Gravity而定,这里用START属性举例),而光标和输入文本的方向又可以根据用户习惯而定(例如输入中文时,我们希望光标在已输入内容的右侧,这样更符合我们的输入习惯)。

java 复制代码
        boolean rtl =
                TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault()) == View.LAYOUT_DIRECTION_RTL;//判断系统语言是否RTL
                
        editText.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); //根据文本语言区分光标在哪侧
        editText.setGravity(rtl ? Gravity.RIGHT : Gravity.LEFT);  //文本在搜索框的哪个位置,end和start是根据文言语言设置的,会导致问题,所以在这里需要手动区分下左右属性,这里的效果对应Gravity.START

效果如下:

1.系统RTL语言,输入法RTL语言:

【输入框空白区域】【光标】【已输入内容】

1.1系统RTL语言,输入法LTR语言:

【输入框空白区域】【已输入内容】【光标】

2.系统LTR语言,输入法LTR语言:

【已输入内容】【光标】【输入框空白区域】

2.1系统LTR语言,输入法RTL语言:

【光标】【已输入内容】【输入框空白区域】

这里的重点主要就是editText的属性需要搭配使用,以下列出各种属性的对应值:

textDirection:

Gravity:

EditText 默认 gravity 通常是 start|top。

textDirection 仅影响文字排列和对齐起点;

gravity 影响整个内容块在控件内的位置。

相关推荐
Bazingga14 分钟前
Java16 record 完整拆解——语法、语义、限制、反射
java·后端
SL_staff2 小时前
规则联动:给工厂装上‘自动化神经反射弧’——JVS·物联网平台规则引擎实战教程
java·人工智能·物联网
骑着蜗牛撵大象3272 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
WJ.Polar2 小时前
Java封装、继承、多态
java·开发语言
ly76892 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
摇滚侠2 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
hunterandroid2 小时前
Retrofit 网络请求的异常处理与重试策略实战
android
weixin_307779133 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
sejinan3 小时前
极致轻量与秒级起播:NativeWasmTv 开源硬核技术解析与升级版体验
android·开源·webview·tv
奇牙coding3 小时前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai