当前位置:文档之家› Android,Android 仿微信自定义数字键盘的实现代码

Android,Android 仿微信自定义数字键盘的实现代码

Android,Android 仿微信自定义数字键盘的实现代码本文介绍了Android 仿微信自定义数字键盘的实现代码,分享给大家,希望对大家有帮助最终效果:实现这个自定义键盘的思路很简单:1. 要写出一个数字键盘的布局;2. 与 Edittext 结合使用,对每个按键的点击事件进行处理;3. 禁用系统软键盘。

有了思路,实现起来就不难了。

1. 实现键盘的 xml 布局网格样式的布局用 GridView 或者 RecyclerView 都可以实现,其实用 GridView 更方便一些,不过我为了多熟悉 RecyclerView 的用法,这里选择用了 RecyclerView 。

[Java] 查看源文件 复制代码?1 <RecyclerView 用来实现键盘布局,上面的 RelativeLayout 则是为了实现收起键盘的点击事件。

2. 在代码中实现键盘布局,填充数据、增加点击事件我们新建类 KeyboardView 继承自 RelativeLayout ,关联上面的布局文件,然后做一些初始化操作:对 RecyclerView 填充数据、设置适配器,设置出现和消失的动画效果,写一些会用到的方法等。

[Java] 查看源文件 复制代码?001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 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);}024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 private void init(Context context, AttributeSet attrs, int defStyleAttr) { LayoutInflater.from(context).inflate(yout_key_board, this);rlBack = findViewById(R.id.rl_back);rlBack.setOnClickListener(new OnClickListener() {@Overridepublic 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;}091 092 093 094 095 096 097 098 099 100 101 102public void setOnKeyBoardClickListener(KeyboardAdapter.OnKeyboardClickListener listener) {adapter.setOnKeyboardClickListener(listener);}public List<String> getDatas() {return datas;}public RelativeLayout getRlBack() {return rlBack;}} Adapter 里面都是很简单的代码,这里就不贴出了,文章末尾我会给出源码下载地址。

到这里为止,自定义数字键盘基本就算写好了,不过最重要的还是要和 Edittext 结合使用。

3. 与 Edittext 结合使用1. 禁用系统软键盘[Java] 查看源文件 复制代码?01 02 03 04 05 06 07 08 09 10 11 12 13 if (Build.VERSION.SDK_INT <= 10) { etInput.setInputType(InputType.TYPE_NULL); } else { getWindow().setSoftInputMode(youtParams.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. 处理各个按键的点击事件[Java] 查看源文件 复制代码?01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 @Overridepublic 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;}}23 24 25 26 27 28 29 30 @Overridepublic 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());}}逻辑也非常简单,看代码就明白了。

相关主题