终于要写博客了,以前总觉得技术大牛才能写博客,后面想想,分享个人想法与技术探讨也是一种不错的交流方式。今天讲讲我在项目中遇到的一个实际需求,也许很多人也遇到过:

EditText要求限制输入数字和英文,但是最好默认弹出数字键盘。

我也上网搜过很多种方式,将自己的总结经验带给大家参考:

方法一 在xml里面设置 android:digits

android:digits="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

结果:可以实现限制输入数字和英文的效果,但是默认弹出的全键盘而不是数字键盘。

方法二 为EditText添加监听器

tvPassword.addTextChangedListener(new TextWatcher() {

@Override

public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override

public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override

public void afterTextChanged(Editable edt) {

try {

String temp = edt.toString();

String tem = temp.substring(temp.length() - 1, temp.length());

char[] temC = tem.toCharArray();

int mid = temC[0];

if (mid >= 48 && mid <= 57) {//数字

return;

}

if (mid >= 65 && mid <= 90) {//大写字母

return;

}

if (mid > 97 && mid <= 122) {//小写字母

return;

}

edt.delete(temp.length() - 1, temp.length());

} catch (Exception e) {

e.printStackTrace();

}

}

});

结果:如果客户只输入数字或英文或中文的情况下是奏效的,但是如果在中文键盘下同时输入汉字与英文(比如:是非得失vvvv),这时候汉字也会显示出来,达不到效果,而且也是全键盘。

以上两种方式都是默认全键盘,那么有些朋友就会说,不是可以设置InputType吗?

设置InputType确实可以实现默认弹出数字键盘,但是你也会发现:刚刚已经设置好的digits或者监听来限制输入数字和英文的,现在变成只能输入数字了!!!

方法三 设置EditText的KeyListener

通过TextView源码,发现了源码里面设置digits是这样的:

//TextView构造方法

……

case com.android.internal.R.styleable.TextView_digits:

digits = a.getText(attr);

break;

……

else if (digits != null) {

createEditorIfNeeded();

mEditor.mKeyListener = DigitsKeyListener.getInstance(digits.toString());

// If no input type was specified, we will default to generic

// text, since we can't tell the IME about the set of digits

// that was selected.

mEditor.mInputType = inputType != EditorInfo.TYPE_NULL

? inputType : EditorInfo.TYPE_CLASS_TEXT;

}

……

从上面可以看出,系统在拿到xml里面设置的digits之后做了这样的操作:

mEditor.mKeyListener = DigitsKeyListener.getInstance(digits.toString());

这个就是创建了一个DigitsKeyListener,并赋值给TextView的mKeyListener ;那么我们也可以为EditText手动设置KeyListener:

String digists = "0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

tvPassword.setKeyListener(DigitsKeyListener.getInstance(digists));

结果:默认弹出数字键盘,限制输入数字和英文效果实现。

到了这里大家有没有觉得奇怪,为什么xml里面设置digits默认弹出的是全键盘,而代码设置却默认弹出的是数字键盘?源码里面不也是这样设置的吗?

其实决定弹出什么键盘是由InputType决定的,上面源码里面设置DigitsKeyListener.getInstance(digists)之后设置了InputType为EditorInfo.TYPE_CLASS_TEXT;这表示键盘是输入字符的,而DigitsKeyListener.getInstance源码里面已经设置了InputType

//TextView调用的getInstance

public static DigitsKeyListener getInstance(String accepted) {

// TODO: do we need a cache of these to avoid allocating?

DigitsKeyListener dim = new DigitsKeyListener();

dim.mAccepted = new char[accepted.length()];

accepted.getChars(0, accepted.length(), dim.mAccepted, 0);

return dim;

}

public DigitsKeyListener() {

this(false, false);

}

/** * Allocates a DigitsKeyListener that accepts the digits 0 through 9, * plus the minus sign (only at the beginning) and/or decimal point * (only one per field) if specified. */

public DigitsKeyListener(boolean sign, boolean decimal) {

mSign = sign;

mDecimal = decimal;

int kind = (sign ? SIGN : 0) | (decimal ? DECIMAL : 0);

mAccepted = CHARACTERS[kind];

}

public int getInputType() {

//因为构造方法传入的mSign和mDecimal都是false,所以返回的是InputType.TYPE_CLASS_NUMBER

int contentType = InputType.TYPE_CLASS_NUMBER;

if (mSign) {

contentType |= InputType.TYPE_NUMBER_FLAG_SIGNED;

}

if (mDecimal) {

contentType |= InputType.TYPE_NUMBER_FLAG_DECIMAL;

}

return contentType;

}

由此看出DigitsKeyListener返回的InputType是InputType.TYPE_CLASS_NUMBER,而TextView并没有使用DigitsKeyListener的InputType,而是自己设置了EditorInfo.TYPE_CLASS_TEXT;故弹出的是全键盘。

我们用代码设置的setKeyListener的源码是这样的

public void setKeyListener(KeyListener input) {

setKeyListenerOnly(input);

fixFocusableAndClickableSettings();

if (input != null) {

createEditorIfNeeded();

try {

mEditor.mInputType = mEditor.mKeyListener.getInputType();

} catch (IncompatibleClassChangeError e) {

mEditor.mInputType = EditorInfo.TYPE_CLASS_TEXT;

}

// Change inputType, without affecting transformation.

// No need to applySingleLine since mSingleLine is unchanged.

setInputTypeSingleLine(mSingleLine);

} else {

if (mEditor != null) mEditor.mInputType = EditorInfo.TYPE_NULL;

}

InputMethodManager imm = InputMethodManager.peekInstance();

if (imm != null) imm.restartInput(this);

}

这里的:

InputMethodManager imm = InputMethodManager.peekInstance();

if (imm != null) imm.restartInput(this);

将软键盘重置了,故使用的软键盘是其自己getInputType方法得到的数字键盘模式。

为什么会弹出数字键盘已经分析完了,这样大家觉得大功告成了?还没完!

注意:弹出数字键盘还能输英文的前提是,可以从数字键盘切换到全键盘!!

应该说大部分输入法的数字键盘都可以返回到全键盘的,但是有少数输入法(比如:三星输入法)不能切换回去!

可能有人想要在后面再给EditText设置setInputType(InputType.TYPE_CLASS_TEXT);让其弹出全键盘,结果是:虽然弹出了全键盘,但是之前设置的digits限制失效了!原因是:

/**TextView 里面的setInputType方法*/

public void setInputType(int type) {

……

//这里相当于从新设置了软键盘模式

InputMethodManager imm = InputMethodManager.peekInstance();

if (imm != null) imm.restartInput(this);

}

setInputType方法将软键盘重置成全键盘模式,前面设置的DigitsKeyListener 完全失效!

总结:

如果想要在代码里面实现设置输入字符的限制(digits)就只能弹出数字键盘,而数字键盘并不是所有都能返回到全键盘,所以,这种方法并不可行,原因是android没有为DigitsKeyListener提供设置inputType这样的接口

如果有高手找出更好的方法,欢迎留言点评,博主将感激不尽!!!

android edittext 英文数字键盘,Adroid EditText限制输入数字与英文默认弹出数字键盘...相关推荐

  1. android仿微信、QQ等聊天界面,实现点击输入框弹出软键盘、点击其他区域收起软键盘,默认滑动至最低端

    如图所示,点击输入框及选择图片和发送按钮时软键盘显示且不消失,点击其他区域,则隐藏软键盘. 主要代码如下: override fun dispatchTouchEvent(ev: MotionEven ...

  2. 打开页面默认弹出软键盘,同时兼容iOS和Android

    // 示例1 open_soft_keyboard({input: "#username" }); // 示例2 open_soft_keyboard({input: 'input ...

  3. 移动端 -- 点击输入框默认弹出数字键盘

    应用场景:手机号.银行卡号等 <input type='tel' pattern='\d*' />

  4. Android中的EditText默认时不弹出软键盘的方法

    在做项目过程中 , 父 Activity 中 用 ViewPager 中 的子 ActivityEditText默认弹出软键盘.这是想屏蔽 软键盘 应该从父 Activity 中处理.处理子 Acti ...

  5. 苹果浏览器弹出软键盘遮挡底部fixed定位问题

    ios微信浏览器将fixed定位自动转换为absolute定位 软键盘遮挡input弹窗 如下图: 苹果手机会弹出软键盘后遮挡住这个评论发布框 解决办法: 我采用让他滚动到底部,然后软键盘就不会挡住输 ...

  6. android EditText 设置弹出数字输入法键盘

    首先设置只能输入数字: <EditText android:id="@+id/edit_digit_input" android:layout_width="wra ...

  7. (转)android EditText 设置弹出数字输入法键盘

    首先设置只能输入数字: [html] view plaincopy <EditText android:id="@+id/edit_digit_input" android: ...

  8. Android EditText设置弹出数字输入法键盘

    Android EditText 设置弹出数字输入法键盘 首先设置只能输入数字: <EditText Android:id="@+id/edit_digit_input" a ...

  9. android EditText 弹出数字键盘

    android EditText 弹出数字键盘 在xml中添加属性 android:digits="1234567890." 设置输入类型 txtBarCode.setInputT ...

  10. Android EditText优先弹出数字输入法

    Android中EditText优先弹出数字输入法 当一个EditText使用数字的频率很高,比如用来输入手机号等等,但是有时候可能也需要使用到输入英文和汉字的需求.这个时候,我们默认当EditTex ...

最新文章

  1. 话说TP框架里的Vendor这目录是干什么用的啊?类库扩展thinkphp3.1版本
  2. Windows Server 2012正式版RDS系列⑥
  3. GitLab远程仓库迁移
  4. QML 发光呼吸动画字体
  5. 硬币问题——固定终点的最长路和最短路
  6. Python_51job爬虫
  7. linux协议栈网桥部分之cam表操作,Docker网络基础 - Linux网桥工作原理与实现
  8. 【渝粤教育】国家开放大学2018年秋季 2332T高等数学基础 参考试题
  9. Vite Vue项目加载Cesium模块
  10. VTD-XML解析XML入门简介
  11. 高中计算机学考操作excel,高中信息技术学业水平考试Word、Excel操作题考点总结...
  12. 高中数学知识点总结归纳之立体几何
  13. STM32F4图像识别
  14. 邓应海:3.24最新黄金走势分析,黄金多空操作建议
  15. Deepin 任务栏网速插件推荐 NetSpeed (重构 lfxSpeed)
  16. 华为服务器2488H V6的ibmc接口配置
  17. 国内主流云厂商下一代云主机最大可售卖384核
  18. COLLADAMaxNew插件,opencollada导出DAE文件格式 for 3dmax2019
  19. Win系统 - 关于GPU,你需要长的“姿势”
  20. 04 从中兴研发主管坠楼来看,什么是程序员的不能承受之重?

热门文章

  1. [渝粤教育] 新乡医学院三全学院 医学分子生物学 参考 资料
  2. KDS加密软件的实际应用
  3. QAV250四轴穿越机安装全程详解(多图)
  4. 后院失火的大疆,距离真正的巨头还有多远?
  5. Stata软件做门槛回归模型(汉森个人主页上的代码)
  6. 【Word】编号与文字间距过大
  7. PowerPoint放映时的动画怎么取消?
  8. 人工智能如何被用于造福人类?
  9. LINUX下截图快捷方式
  10. 拖放drag、drog