本文介绍了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,defStyleAttr); init(context,defStyleAttr); } private voID init(Context context,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); } // d出软键盘 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 的时候系统软键盘依然会d出。最后找到了这个方法,利用反射强制不d出软键盘,效果不错。
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,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()); } }
逻辑也非常简单,看代码就明白了。最终的效果就是第一张图的样子。
这个键盘很简单,打算之后写一个模仿微信或者支付宝的支付密码输入布局。
->->->点击下载源码<-<-<-
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的Android 仿微信自定义数字键盘的实现代码全部内容,希望文章能够帮你解决Android 仿微信自定义数字键盘的实现代码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)