android 数字键盘
16lz
2021-01-23
android平常在输入密码或者金额的时候需要自定义输入的数字键盘
引用:我是在这个软键盘的基础上进行修改的
https://github.com/xuejinwei/NumberKeyboard
1.
package com.dejun.commonsdk.wight.numkeyboard;import android.app.Activity;import android.content.Context;import android.inputmethodservice.Keyboard;import android.inputmethodservice.KeyboardView;import android.os.Build;import android.text.Editable;import android.text.InputType;import android.view.View;import android.view.inputmethod.InputMethodManager;import android.widget.EditText;import com.dejun.commonsdk.R;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Random;/** * Author:DoctorWei * Time:2018/12/27 9:13 * Description:自定义软件盘 工具类 * email:[email protected] */public class KeyboardUtil { private Activity mActivity; private boolean mIfRandom; private MyKeyBoardView mKeyboardView; private Keyboard mKeyboardNumber;//数字键盘 private EditText mEditText; public KeyboardUtil(Activity activity) { this(activity, false); } public KeyboardUtil(Activity activity, boolean ifRandom) { this.mActivity = activity; this.mIfRandom = ifRandom; mKeyboardNumber = new Keyboard(mActivity, R.xml.keyboard_number); mKeyboardView = (MyKeyBoardView) mActivity.findViewById(R.id.keyboard_view); } /** * edittext绑定自定义键盘 * * @param editText 需要绑定自定义键盘的edittext */ public void attachTo(EditText editText) { this.mEditText = editText; hideSystemSofeKeyboard(mActivity.getApplicationContext(), mEditText); showSoftKeyboard(); } public void showSoftKeyboard() { if (mKeyboardNumber == null) { mKeyboardNumber = new Keyboard(mActivity, R.xml.keyboard_number); } if (mKeyboardView == null) { mKeyboardView = (MyKeyBoardView) mActivity.findViewById(R.id.keyboard_view); } if (mIfRandom) { randomKeyboardNumber(); } else { mKeyboardView.setKeyboard(mKeyboardNumber); } mKeyboardView.setEnabled(true); mKeyboardView.setPreviewEnabled(false); mKeyboardView.setVisibility(View.VISIBLE); mKeyboardView.setOnKeyboardActionListener(mOnKeyboardActionListener); } private KeyboardView.OnKeyboardActionListener mOnKeyboardActionListener = new KeyboardView.OnKeyboardActionListener() { @Override public void onPress(int primaryCode) { } @Override public void onRelease(int primaryCode) { } @Override public void onKey(int primaryCode, int[] keyCodes) { Editable editable = mEditText.getText(); int start = mEditText.getSelectionStart(); if (primaryCode == Keyboard.KEYCODE_DELETE) {// 回退 if (editable != null && editable.length() > 0) { if (start > 0) { editable.delete(start - 1, start); } } } else if (primaryCode == Keyboard.KEYCODE_CANCEL) {// 隐藏键盘 hideKeyboard(); if (mOnCancelClick != null) { mOnCancelClick.onCancellClick(); } } else if (primaryCode == Keyboard.KEYCODE_DONE) {// 隐藏键盘 hideKeyboard(); if (mOnOkClick != null) { mOnOkClick.onOkClick(); } } else { editable.insert(start, Character.toString((char) primaryCode)); } } @Override public void onText(CharSequence text) { } @Override public void swipeLeft() { } @Override public void swipeRight() { } @Override public void swipeDown() { } @Override public void swipeUp() { } }; /** * 隐藏系统键盘 * * @param editText */ public static void hideSystemSofeKeyboard(Context context, EditText editText) { int sdkInt = Build.VERSION.SDK_INT; if (sdkInt >= 11) { try { Class cls = EditText.class; Method setShowSoftInputOnFocus; setShowSoftInputOnFocus = cls.getMethod("setShowSoftInputOnFocus", boolean.class); setShowSoftInputOnFocus.setAccessible(true); setShowSoftInputOnFocus.invoke(editText, false); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } else { editText.setInputType(InputType.TYPE_NULL); } // 如果软键盘已经显示,则隐藏 InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); } public interface OnOkClick { void onOkClick(); } public interface onCancelClick { void onCancellClick(); } public OnOkClick mOnOkClick = null; public onCancelClick mOnCancelClick; public void setOnOkClick(OnOkClick onOkClick) { mOnOkClick = onOkClick; } public void setOnCancelClick(onCancelClick onCancelClick) { mOnCancelClick = onCancelClick; } private boolean isNumber(String str) { String wordstr = "0123456789"; return wordstr.contains(str); } private void randomKeyboardNumber() { List keyList = mKeyboardNumber.getKeys(); // 查找出0-9的数字键 List newkeyList = new ArrayList(); for (int i = 0; i < keyList.size(); i++) { if (keyList.get(i).label != null && isNumber(keyList.get(i).label.toString())) { newkeyList.add(keyList.get(i)); } } // 数组长度 int count = newkeyList.size(); // 结果集 List resultList = new ArrayList(); // 用一个LinkedList作为中介 LinkedList temp = new LinkedList(); // 初始化temp for (int i = 0; i < count; i++) { temp.add(new KeyModel(48 + i, i + "")); } // 取数 Random rand = new Random(); for (int i = 0; i < count; i++) { int num = rand.nextInt(count - i); resultList.add(new KeyModel(temp.get(num).getCode(), temp.get(num).getLable())); temp.remove(num); } for (int i = 0; i < newkeyList.size(); i++) { newkeyList.get(i).label = resultList.get(i).getLable(); newkeyList.get(i).codes[0] = resultList.get(i) .getCode(); } mKeyboardView.setKeyboard(mKeyboardNumber); } public void showKeyboard() { int visibility = mKeyboardView.getVisibility(); if (visibility == View.GONE || visibility == View.INVISIBLE) { mKeyboardView.setVisibility(View.VISIBLE); } } public void hideKeyboard() { int visibility = mKeyboardView.getVisibility(); if (visibility == View.VISIBLE) { mKeyboardView.setVisibility(View.GONE); } }}3.使用
et = (EditText) findViewById(R.id.et);final KeyboardUtil keyboardUtil = new KeyboardUtil(this,false);//false不随机et.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { keyboardUtil.attachTo(et); }});
更多相关文章
- Android禁用键盘的所有按键
- 【android】禁止Edittext弹出软键盘并且使光标正常显示
- 输入键盘始终停留以及尺寸转换得到默认字体大小
- Android全屏模式,监听软键盘弹出事件。
- Android应用程序键盘(Keyboard)消息处理机制分析(2)
- Android的EditText控件点击虚拟键盘上的回车怎么跳到下一个EditT
- Android进入页面开始就自动弹出软键盘
- android点击屏幕隐藏小键盘
- Android 总结:自定义键盘实现原理和三种实例详解