您当前的位置:网站首页>小小冒险记,Android 验证码输入框的完成,肌酸激酶

小小冒险记,Android 验证码输入框的完成,肌酸激酶

2019-04-18 12:13:47 投稿作者:admin 围观人数:308 评论人数:0次

前语

验证码输入框是许多APP必不可少的组件,之前在重构注册登录页面的时分,从头规划了UI,所以不能再简略的用EditText来做了,所以这篇文章将共享一下怎么完结一个常见的验证码输入框。

正文

先搂一眼作用吧

不要把注意力都放在头顶的那一抹绿上,重点在输入框,或许大多数APP里都是选用6个方框的UI作用,我这儿是依照咱们规划的要求,用6根横线来划出6个数字的方位。一开始我想的是直接用6个TextView,然后传递焦点的做法,可是发现完结起来有必定的难度。又在网上查了一下,发现比较靠谱的办法是用6个TextView加一个EditText来完结,也依照这个办法去完结了,可是后来在测验的时分就发现了问题:网上给出的完结办法需求监罗马帝国艳情史听软键盘的删去按钮

editText.setOnKeyListener( newOnKeyListener() {

@ Override

publicboolean onKey(View v, intkeyCode, KeyEvent event) {

if(ke宝宝身高体重标准表yCode == KeyEvent.KEYCODE_DEL

&& event.getAction() == KeyEvent.ACTION_DOWN) {

小小冒险记,Android 验证码输入框的完结,肌酸激酶

//TODO:

returntrue;

}

returnfalse;

}

});

这是一个咱们熟知的写法,可是这个监听的办法其实并不靠谱(在安卓原生键盘上就监听不到),由于这个监听是否触发,并没有强制的要求,全看输入法开发者的心境,这是官方文档中的描绘:

Key presses in software keyboards will generally NOT trigger this method, although some may elect to do so in some situations.

只能输入,不能删去,这可不可啊,用户complex肯定会骂娘的,我可不想被拿去去祭天什么的…

所以乎只能想办法在原有的基础上做一些修正,来躲避这个问题,终究选用的计划是:选用一个TextView的数组来保护6个TextView,然后藏一个通明的EditTextView在后面用于接纳用户输入的内容,再把输入的内容展现到6个TextView上就行了,UI什么的能够自己随意规划。在完结的过程中,遇到的一个关键问题便是:当输入的内容超越红足一世6位炀今后我该怎么处理?一开始的计划是通过判别当时输入的位数然小小冒险记,Android 验证码输入框的完结,肌酸激酶后再做相应的处理,网上的计划也是这么完结的,我后来一想湖北省军区司令员张践,底子用不着这么费事,只需求一行特点就能处理这个问题:

android:maxLength= "6"

只需求在EditText的特点里约束它的最大长度,就不必再去代码里做处理了,直接把EditTextView里的内容彻底照搬到TextView上就能够了。

终究的完好代码如下:

publicclassV黄河大合唱erifyCode小小冒险记,Android 验证码输入框的完结,肌酸激酶ViewextendsRelativeLayout{

privateEditText edit小小冒险记,Android 验证码输入框的完结,肌酸激酶Text;

privateTextView[] textViews;

privatestaticintMAX = 6;

privateString inputContent;

publicVerifyCodeView(Context context){

this(context, null);

}

publicVerifyCodeView(Context context, AttributeSet attrs){

this(context, attrs, 0);

}

publicVerifyCodeView(Context context, AttributeSet attrs, intdefStyleAttr){

super龙应台老二子菲利普(context, attrs, defStyleAttr);

View.inflate(我家反派画风百变context, R.layout.view_verify_code, this);

textViews = newTextView[MAX];

textViews[ 0] = (TextView) findViewById(R.id.tv_0);

textViews[ 1] = (TextView) findViewById(R.id.tv_1);

textViews[ 2] = (TextView) findViewById(R.id.tv_2);

textViews[ 3] = (TextView) findViewById(R.id.tv_3);

textViews[ 4] = (TextView小小冒险记,Android 验证码输入框的完结,肌酸激酶) findViewById(R.id.tv_4);

textViews[ 5] = (TextView) findViewById(R.id.tv_5);

editText = (EditText) findViewById小小冒险记,Android 验证码输入框的完结,肌酸激酶(R.id.edit_text_view);

editText.setCursorVisible( false); //躲藏光标

setEditTextListener();

}

privatevoidsetEditTextListener(){

editText.addTextChangedListener( newTextWatcher() {

@Override

publicvoidbeforeTextChanged(CharSequence charSequence, inti, 徽州inti1, inti2){

}

@Override

publicvoidonTextChanged(CharSequence charSequence, inti, inti1, 何不食肉糜inti2){

}

@Override

publicvoidafterTextChanged(Editable editable){

inputContent = editText.getText().toString();

if(inputCompleteListener != null) {

if(inputContent.length() >= MAX) {

inputCompleteListener.inputComplete();

} else{

inputCompleteListener.invalidContent();

}

}

for( inti = 0; i < MAX; i++) {

if(i < inputContent.length()) {

textViews[i].setText(String.valueOf(inputContent.charAt(i)));

} else{

textViews[i].setText( "");

}

}

}

});

}

privateInputCompleteListener inputCompleteListener;

publicvoidsetInputC赵惟依ompleteListener(InputCompleteListener inputCompleteListener){

this.inputCompleteListener = inputCompleteListener;

}

publicinterfaceInputCompleteListener{

voidinputComplete();

voidinvalidContent();

}

publicString getEditContent(){

returninputContent;

}

}

通过thisfeng的提示,发现存在几个问题:

1.双击和长按会选中EditText的内容,呈现复制粘贴等选项

2.光标方位会跟着点击而改动,输入数字或许会刺进到中心的方位

所以做了相应的修正:

//屏蔽长按事情

android:longClickable= "false"

运用自定义EditText:

publiccla杨子珊ssMyEditT养血清脑颗粒extextendsAppCompatEditText{

privatelonglastTime = 0;

publicMyEditText(Context context){

super(context);

}

publicMyEditText(Context context, AttributeSet attrs){

super(context, attrs);

}

publicMyEditText(Context context, AttributeSet attrs, intdefStyleAttr){

super(context, attrs, defStyleAttr);

}

@Override

protectedvoidonSelectionChanged(intselStart, intselEnd){

super.onSelectionChanged(selStart, selEnd);

//把光标方位固定在最末

this.setSelection( this.getText().length());

}

@Override

publicbooleanonTouchEvent(MotionEvent event){

//屏蔽双击事情

switch(event.getAction(风起苍岚漫画)) {

caseMotionEvent.ACTION_DOWN:

long铝合金门窗currentTime = System.currentTimeMillis();

if(currentTime - lastTime < 500) {

lastTime = currentTime;

returntrue;

} 小小冒险记,Android 验证码输入框的完结,肌酸激酶else{

lastTime = currentTime;

}

break;

}

returnsuper.onTouchEvent(event);

}

}

假如需求完好的demo,能够拜访我的github:https://github.com/jb274585381/Veri洋酒fyCodeViewDemo

结语

有时分咱们完结一个需求,不光要考虑终究的作用,还要考虑时刻本钱,能用最简家电清洗单的办法完结当然是最好的,省下的时刻拿来打把昆特牌也是不错的。并且写的代码越少,犯错的几率越低嘛,是不是~ 好了今日就共享到这儿,我要去熬我的西米露了。如有过错,欢迎咱们纠正。

作者:实例波

链接:https://www.jianshu.com/p/3238a5afc21c

声明:该文观念仅代表作者自己,搜狐号系信白菜炖粉条息发布渠道,搜狐仅供给信息存储空间效劳。
the end
北京好玩的真人CS推荐、吃个玩乐推荐,本地新闻