• 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

  • 相关阅读:
    【面试经典150 | 哈希表】两数之和
    【面向对象】【0x01】 对象属性操作
    Linux多线程【线程控制】
    SpringMVC程序开发
    【python中级】获得计算机的物理CPU核心数量
    Goland常用快捷键设置
    探测SiTime硅晶振输出的实用指南
    二分查找(闭区间)
    什么是b3dm?b3dm详解
    Oracle 数据库查询下级_Oracle数据库之递归查询
  • 原文地址:https://blog.csdn.net/crazestone0614/article/details/134243193