Android 仿微信自定义数字键盘的实现代码
程序员文章站
2023-01-26 21:48:48
本文介绍了android 仿微信自定义数字键盘的实现代码,分享给大家,希望对大家有帮助
最终效果:
实现这个自定义键盘的思路很简单:
要写出一个数字键...
本文介绍了android 仿微信自定义数字键盘的实现代码,分享给大家,希望对大家有帮助
最终效果:
实现这个自定义键盘的思路很简单:
- 要写出一个数字键盘的布局;
- 与 edittext 结合使用,对每个按键的点击事件进行处理;
- 禁用系统软键盘。
有了思路,实现起来就不难了。
1. 实现键盘的 xml 布局
网格样式的布局用 gridview 或者 recyclerview 都可以实现,其实用 gridview 更方便一些,不过我为了多熟悉 recyclerview 的用法,这里选择用了 recyclerview。
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <view android:layout_width="match_parent" android:layout_height="2px" android:background="@color/btn_gray"/> <relativelayout android:id="@+id/rl_back" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/iv_back_bg" android:padding="10dp"> <imageview android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerinparent="true" android:src="@mipmap/keyboard_back"/> </relativelayout> <view android:layout_width="match_parent" android:layout_height="1px" android:background="@color/btn_gray"/> <android.support.v7.widget.recyclerview android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/keyboard_bg" android:overscrollmode="never"></android.support.v7.widget.recyclerview> </linearlayout>
recyclerview 用来实现键盘布局,上面的 relativelayout 则是为了实现收起键盘的点击事件。
2. 在代码中实现键盘布局,填充数据、增加点击事件
我们新建类 keyboardview 继承自 relativelayout,关联上面的布局文件,然后做一些初始化操作:对 recyclerview 填充数据、设置适配器,设置出现和消失的动画效果,写一些会用到的方法等。
public class keyboardview extends relativelayout { private relativelayout rlback; private recyclerview recyclerview; private list<string> datas; private keyboardadapter adapter; private animation animationin; private animation animationout; public keyboardview(context context) { this(context, null); } public keyboardview(context context, attributeset attrs) { this(context, attrs, 0); } public keyboardview(context context, attributeset attrs, int defstyleattr) { super(context, attrs, defstyleattr); init(context, attrs, defstyleattr); } private void init(context context, attributeset attrs, int defstyleattr) { layoutinflater.from(context).inflate(r.layout.layout_key_board, this); rlback = findviewbyid(r.id.rl_back); rlback.setonclicklistener(new onclicklistener() { @override public void onclick(view view) { // 点击关闭键盘 dismiss(); } }); recyclerview = findviewbyid(r.id.recycler_view); initdata(); initview(); initanimation(); } // 填充数据 private void initdata() { datas = new arraylist<>(); for (int i = 0; i < 12; i++) { if (i < 9) { datas.add(string.valueof(i + 1)); } else if (i == 9) { datas.add("."); } else if (i == 10) { datas.add("0"); } else { datas.add(""); } } } // 设置适配器 private void initview() { recyclerview.setlayoutmanager(new gridlayoutmanager(getcontext(), 3)); adapter = new keyboardadapter(getcontext(), datas); recyclerview.setadapter(adapter); } // 初始化动画效果 private void initanimation() { animationin = animationutils.loadanimation(getcontext(), r.anim.keyboard_in); animationout = animationutils.loadanimation(getcontext(), r.anim.keyboard_out); } // 弹出软键盘 public void show() { startanimation(animationin); setvisibility(visible); } // 关闭软键盘 public void dismiss() { if (isvisible()) { startanimation(animationout); setvisibility(gone); } } // 判断软键盘的状态 public boolean isvisible() { if (getvisibility() == visible) { return true; } return false; } public void setonkeyboardclicklistener(keyboardadapter.onkeyboardclicklistener listener) { adapter.setonkeyboardclicklistener(listener); } public list<string> getdatas() { return datas; } public relativelayout getrlback() { return rlback; } }
adapter 里面都是很简单的代码,这里就不贴出了,文章末尾我会给出源码下载地址。
到这里为止,自定义数字键盘基本就算写好了,不过最重要的还是要和 edittext 结合使用。
3. 与 edittext 结合使用
1. 禁用系统软键盘
if (build.version.sdk_int <= 10) { etinput.setinputtype(inputtype.type_null); } else { getwindow().setsoftinputmode(windowmanager.layoutparams.soft_input_state_always_hidden); try { class<edittext> cls = edittext.class; method setshowsoftinputonfocus = cls.getmethod("setshowsoftinputonfocus", boolean.class); setshowsoftinputonfocus.setaccessible(true); setshowsoftinputonfocus.invoke(etinput, false); } catch (exception e) { e.printstacktrace(); } }
在网上找了一些方法,但是点击 edittext 的时候系统软键盘依然会弹出。最后找到了这个方法,利用反射强制不弹出软键盘,效果不错。
2. 处理各个按键的点击事件
@override public void onkeyclick(view view, recyclerview.viewholder holder, int position) { switch (position) { case 9: // 按下小数点 string num = etinput.gettext().tostring().trim(); if (!num.contains(datas.get(position))) { num += datas.get(position); etinput.settext(num); etinput.setselection(etinput.gettext().length()); } break; default: // 按下数字键 if ("0".equals(etinput.gettext().tostring().trim())) { // 第一个数字按下0的话,第二个数字只能按小数点 break; } etinput.settext(etinput.gettext().tostring().trim() + datas.get(position)); etinput.setselection(etinput.gettext().length()); break; } } @override public void ondeleteclick(view view, recyclerview.viewholder holder, int position) { // 点击删除按钮 string num = etinput.gettext().tostring().trim(); if (num.length() > 0) { etinput.settext(num.substring(0, num.length() - 1)); etinput.setselection(etinput.gettext().length()); } }
逻辑也非常简单,看代码就明白了。最终的效果就是第一张图的样子。
这个键盘很简单,打算之后写一个模仿微信或者支付宝的支付密码输入布局。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 智能手环纯粹的数据记录并不会带来乐趣