• Android EditText 实现强制性弹出只能输入英文的键盘


        如果 EditText 控件不做任何特殊处理,例如笔者手机默认弹出的是百度输入法的软键盘,可实现中英文切换,并且自带英文单词智能联想功能(与系统安装输入法和设置相关)。但在某些应用场景下,例如在英语APP里练习英文句子听写,需要实现:

    默认弹出只能输入英文的键盘,不允许切换到中文输入键盘,屏蔽输入法的智能联想功能。

        下面直接给出答案:

    方式1:EditText 属性:

    android:inputType="textVisiblePassword | textMultiLine"

    方式2:代码实现

    setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD | InputType.TYPE_TEXT_FLAG_MULTI_LINE);
    

    解释:

        因为 EditText 的属性设置里并没有一个专门设置只能弹出英文键盘的功能 。(注意区分:android:digits="abcd...xyz 123456789" 这个只能实现输入内容的过滤)

        textVisiblePassword InputType.TYPE_TEXT_VARIATION_NORMAL 的字面意思是“输入密码可见”的意思,虽然与“只限英文输入”的需求实现并不对应,但是却“歪打正着”地实现了我们的需求,但是如果只添加此属性,却又无法输入多行文本(按回车键也不行),所以还需添加属性 textMultiLine 或 InputType.TYPE_TEXT_FLAG_MULTI_LINE。

    笔者使用的是华为手机,所以采用上面的方式弹出的是一个只能输入英文的华为安全键盘。

    疑问:

        那为什么第二个方法还需要添加一个 InputType.TYPE_CLASS_TEXT 呢?比第一个方法多设置了一个属性。经过笔者测试,如果不添加该属性,如下:

    setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD | InputType.TYPE_TEXT_FLAG_MULTI_LINE);

        虽然从效果上看,确实能实现只弹出英文键盘的目的,但还是无法输入多行文本,尽管我们特地还添加了一个“TYPE_TEXT_FLAG_MULTI_LINE”属性。后面查看相关属性值的文档就明白了,在EditText 的 XML布局文件里点击 InputType 的对应的链接,进入到 attrs.xml 文件,找到 textVisiblePassword

    1. <flag name="textVisiblePassword" value="0x00000091" />

        看到了吗?textVisiblePassword 的值为 0x00000091,而且写的非常清楚的,它是:TYPE_CLASS_TEXT 与 TYPE_TEXT_VARIATION_VISIBLE_PASSWORD 两者二进制“或运算”的结果。两个属性值得二进制值分别为:0x00000001 和 0x00000090,两者的或运算就等于0x00000091。

    1. /**
    2. * Variation of {@link #TYPE_CLASS_TEXT}: entering a password, which should
    3. * be visible to the user.
    4. */
    5. public static final int TYPE_TEXT_VARIATION_VISIBLE_PASSWORD = 0x00000090;
    1. /**
    2. * Class for normal text. This class supports the following flags (only
    3. * one of which should be set):
    4. * {@link #TYPE_TEXT_FLAG_CAP_CHARACTERS},
    5. * {@link #TYPE_TEXT_FLAG_CAP_WORDS}, and.
    6. * {@link #TYPE_TEXT_FLAG_CAP_SENTENCES}. It also supports the
    7. * following variations:
    8. * {@link #TYPE_TEXT_VARIATION_NORMAL}, and
    9. * {@link #TYPE_TEXT_VARIATION_URI}. If you do not recognize the
    10. * variation, normal should be assumed.
    11. */
    12. public static final int TYPE_CLASS_TEXT = 0x00000001;

    所以,方式二相对方式一,在用代码实现时,需要多加一个属性:TYPE_CLASS_TEXT。

    另外:

        如果你只是想“优先”弹出英文键盘,但还是允许可以切换到中文输入法,可以做下面的设置:

    InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL

    最后:

        如果真的想完全掌控键盘的一切,那就定制一款英文键盘吧,这个虚拟软键盘可以自主定义全部的字母和数字,包括他们的布局和事件监听等。

    自定义软键盘,请参考:https://www.cnblogs.com/sixrain/p/7793610.html

  • 相关阅读:
    软件测评中心进行安全测试有哪些流程?安全测试报告如何收费?
    数据结构:堆
    CLIP扩展
    C Primer Plus(6) 中文版 第2章 C语言概述 2.3 简单程序的结构
    SpringBoot:ch02 配置文件(日志)
    【C语言深入理解指针(3)】
    硬件开发笔记(十): 硬件开发基本流程,制作一个USB转RS232的模块(九):创建CH340G/MAX232封装库sop-16并关联原理图元器件
    SSM学生信息管理系统(含源码+论文+答辩PPT等)
    YOLOv5结合华为诺亚VanillaNet Block模块
    dcase_util教程
  • 原文地址:https://blog.csdn.net/crazestone0614/article/details/134243193