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:1348172474@qq.com
*/
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<EditText> 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<Keyboard.Key> keyList = mKeyboardNumber.getKeys();
// 查找出0-9的数字键
List<Keyboard.Key> newkeyList = new ArrayList<Keyboard.Key>();
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<KeyModel> resultList = new ArrayList<KeyModel>();
// 用一个LinkedList作为中介
LinkedList<KeyModel> temp = new LinkedList<KeyModel>();
// 初始化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);
}
});