android 支付密码输入框,类支付宝密码输入框NumberEditText(简单粗暴的定制方式)...

因为项目需要,设计了一个下图样的验证码输入框(ps:个人认为还不如直接一个EditText,用户友好度可能更好,何况这页面99.9%的用户不会使用,但是没办法,别人才是专业的设计师)。

cb07801a8e489195145f068cf087a701.png

其实界面很简单,一个弹出框口,中间几个简单控件。也就验证码输入框需要自定义一下。首先看到,觉得继承个EditText或者View绘制下,然后监听下输入框情况就可以了。但是,本人比较懒,能用系统提供方法实现的话就尽量少去搞自定义。然后就变成了六个EditText接收值,但是如果每个EditText都搞监听,太浪费资源了,性能开销太大,输入也不流畅。之后,换下思维, 用了个十分粗暴但简单实用的方式:六个TextView+一个不可见EditText。

大概思路,六个带边框的TextView, 然后一个完全透明的EditText覆盖在六个TextView上用来接收键盘的输入(这样的好处事,不用自己处理键盘事件,也因此少了键盘带来的各种兼容性问题)。然后给EditText加一个监听,将接收到的收入值复制给每个TextView。

View view = LayoutInflater.from(context).inflate(R.layout.e7yoo_number_edittext, null);

inputTv[0] = (TextView) view.findViewById(R.id.e7yoo_number_edittext_tv0);

inputTv[1] = (TextView) view.findViewById(R.id.e7yoo_number_edittext_tv1);

inputTv[2] = (TextView) view.findViewById(R.id.e7yoo_number_edittext_tv2);

inputTv[3] = (TextView) view.findViewById(R.id.e7yoo_number_edittext_tv3);

inputTv[4] = (TextView) view.findViewById(R.id.e7yoo_number_edittext_tv4);

inputTv[5] = (TextView) view.findViewById(R.id.e7yoo_number_edittext_tv5);

invisibleEt = (EditText) view.findViewById(R.id.e7yoo_number_edittext_et);

invisibleEt.addTextChangedListener(new InvisibleEtTextWatcher());

addView(view);

在TextWatcher的afterTextChanged(Editable s)中

for(int i = 0; i < tvLength; i++) {

if(i < length) {

inputTv[i].setText("" + chars[i]);

} else {

inputTv[i].setText("");

}

}

if(length == tvLength && onInputFinishListener != null) {

onInputFinishListener.onInputFinish(text);

}

另外提供清除方法

public void clearText() {

int tvLength = inputTv.length;

for (int i = 0; i < tvLength; i++) {

inputTv[i].setText("");

}

invisibleEt.setText("");

}

和输入完成回调

public void setOnInputFinish(OnInputFinishListener listener) {

this.onInputFinishListener = listener;

}

public interface OnInputFinishListener {

void onInputFinish(String text);

}

使用很简单

android:id="@+id/numberEt"

android:layout_width="match_parent"

android:layout_height="wrap_content" />

然后在Java代码中

numberEditText = (NumberEditText) findViewById(R.id.numberEt);

numberEditText.setOnInputFinish(new NumberEditText.OnInputFinishListener() {

@Override

public void onInputFinish(String text) {

// 展示输入结果

resultTv.setText("上次输入为:" + text);

// 清空输入框

numberEditText.clearText();

}

});

这样做可以算是很简单粗暴的方式了,而且在UI发生变化时,也方便做一些调整。当然比较高级的Android玩家可能更喜欢去做一些标准的自定义控件,但我更推崇的是,在性能差别不大的情况下,使用最简单最快捷的方式去处理问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值