内容简介:今天带来工作中的一个小安利,产品要求对用户名输入需要限制,只能是数字和字母,符号,哈哈,又可以愉快的玩耍咯...
Github地址 ,欢迎点赞,fork
今天带来工作中的一个小安利,产品要求对用户名输入需要限制,只能是数字和字母,符号, 不能包含空格和键盘上输入的emoji .开始拿到这个需求,觉得给 EditText 增加一个 addTextChangedListener ,里面做各种判断不就OK 啦!
哈哈,又可以愉快的玩耍咯...
但是回调里面逻辑太多,看着也不爽,不符合我们 程序员 的气质,简洁大方,干净利落!所以我特意去看了 du 了一下, 结合自己的实际要求,重写了 EditText 的 onCreateInputConnection() 方法,在那里做文章,请看下面源码(如果还有不清楚的,可以留言或者看 Github地址 )
只需要自定义EditText重写其onCreateInputConnection()方法,然后再定义一个内部类就好,下面代码即拷即用
首先,看看 LimitEditText
class LimitEditText(context: Context, attrs: AttributeSet, defStyleAttr: Int) : EditText(context, attrs, defStyleAttr) { constructor(context: Context, attrs: AttributeSet) : this(context, attrs, 0) /** * 输入法 */ override fun onCreateInputConnection(outAttrs: EditorInfo?): InputConnection { return InnerInputConnection(super.onCreateInputConnection(outAttrs), false) } } class InnerInputConnection(target: InputConnection, mutable: Boolean) : InputConnectionWrapper(target, mutable) { // 数字,字母 private val pattern = Pattern.compile("^[0-9A-Za-z_]\$") // 标点 private val patternChar = Pattern.compile("[^\\w\\s]+") // EmoJi private val patternEmoJi = Pattern.compile("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]", Pattern.UNICODE_CASE or Pattern.CASE_INSENSITIVE) // 英文标点 private val patternEn = Pattern.compile("^[`~!@#\$%^&*()_\\-+=<>?:\"{},.\\\\/;'\\[\\]]\$") // 中文标点 private val patternCn = Pattern.compile("^[·!#¥(——):;“”‘、,|《。》?、【】\\[\\]]\$") // 对输入拦截 override fun commitText(text: CharSequence?, newCursorPosition: Int): Boolean { if (patternEmoJi.matcher(text).find()){ return false } if (pattern.matcher(text).matches() || patternChar.matcher(text).matches()) { return super.commitText(text, newCursorPosition) } return false } } 复制代码
总计60行代码,可以搞定一般需求啦,再来看看其布局用法(xml文件),平时怎么在布局写EditText,还是怎么写!
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="cn.molue.jooyer.limitedittext.MainActivity"> <cn.molue.jooyer.limitedittext.LimitEditText android:id="@+id/let_main" android:layout_width="match_parent" android:layout_height="50dp" android:layout_margin="10dp" android:text="Hello World!" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"/> </android.support.constraint.ConstraintLayout> 复制代码
最后来看看在 Activity 中用法,其实和一般普通 EditText 用法一致啦!
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // demo 中默认 LimitEditText 只能输入字母数字和标点符号 // 延时主要是更方便观察 window.decorView.postDelayed({ // 注意,获得焦点需要自己再处理下,其实很简单,如下: let_main.isFocusable = true let_main.isFocusableInTouchMode = true let_main.requestFocus() },1000) } } 复制代码
当然,这些限制正则也可以在 LimitEditText 中定义方法,大家需要什么加入什么就好了!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 由Vue实现限制文本框输入长度引发的思考
- 由Vue实现限制文本框输入长度引发的思考
- 详解nginx的请求限制(连接限制和请求限制)
- PHP利用PCRE回溯次数限制绕过某些安全限制
- Android输入系统(一)输入事件传递流程和InputManagerService的诞生
- Android输入系统(四)输入事件是如何分发到目标窗口的?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Automate This
Christopher Steiner / Portfolio / 2013-8-9 / USD 25.95
"The rousing story of the last gasp of human agency and how today's best and brightest minds are endeavoring to put an end to it." It used to be that to diagnose an illness, interpret legal docume......一起来看看 《Automate This》 这本书的介绍吧!