直接上功能图片有图有真相

android 自定义数字软键盘_第1张图片

该功能主要是通过抄作android自带控件KeyboardView实现的

 先上控制布局文件代码

<?xml version="1.0" encoding="utf-8"?>        
接着是Activity的代码

package com.kxiang.quick.function.activity.keboard;import android.os.Bundle;import android.text.InputType;import android.view.WindowManager;import android.widget.EditText;import com.kxiang.quick.R;import com.kxiang.quick.base.BaseActivity;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class KeyboardActivity extends BaseActivity {    @Override    protected int getContentView() {        return R.layout.activity_keyboard;    }    private EditText et_number;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        et_number = (EditText) findViewById(R.id.et_number);        hideSoftInputMethod(et_number);        new KeyboardUtils(thisActivity, et_number);    }    // 隐藏系统键盘并且让光标存在    public void hideSoftInputMethod(EditText ed) {        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);        int currentVersion = android.os.Build.VERSION.SDK_INT;        String methodName = null;        if (currentVersion >= 16) {            // 4.2            methodName = "setShowSoftInputOnFocus";        }        else if (currentVersion >= 14) {            // 4.0            methodName = "setSoftInputShownOnFocus";        }        if (methodName == null) {            ed.setInputType(InputType.TYPE_NULL);        }        else {            Class cls = EditText.class;            Method setShowSoftInputOnFocus;            try {                setShowSoftInputOnFocus = cls.getMethod(methodName, boolean.class);                setShowSoftInputOnFocus.setAccessible(true);                setShowSoftInputOnFocus.invoke(ed, false);            } catch (NoSuchMethodException e) {                ed.setInputType(InputType.TYPE_NULL);                e.printStackTrace();            } catch (IllegalAccessException e) {                // TODO Auto-generated catch block                e.printStackTrace();            } catch (InvocationTargetException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }}
下面是对KeyboardView类的一些操作,上KeyboardUtils方法

package com.kxiang.quick.function.activity.keboard;import android.app.Activity;import android.inputmethodservice.Keyboard;import android.inputmethodservice.KeyboardView;import android.text.Editable;import android.widget.EditText;import com.kxiang.quick.R;import com.kxiang.quick.utils.LogUtils;/** * 项目名称:RapidDevelopment * 创建人:kexiang * 创建时间:2017/3/1 11:15 */public class KeyboardUtils {    private Keyboard symbols;// 数字键盘    private EditText showNumber;    private KeyboardView keyboardView;    private boolean point = false;    private int pointNumber = 0;    public KeyboardUtils(Activity activity, EditText showNumber) {        this.showNumber = showNumber;        symbols = new Keyboard(activity, R.xml.symbols);        keyboardView = (KeyboardView) activity.findViewById(R.id.keyboardview);        keyboardView.setKeyboard(symbols);        keyboardView.setEnabled(true);        keyboardView.setPreviewEnabled(false);        keyboardView.setOnKeyboardActionListener(keyboardListener);    }    private KeyboardView.OnKeyboardActionListener keyboardListener = new KeyboardView.OnKeyboardActionListener() {        private final int NUMBER = 2;        @Override        public void onPress(int primaryCode) {            LogUtils.toE("onPress:" + primaryCode);        }        @Override        public void onRelease(int primaryCode) {            LogUtils.toE("onRelease:" + primaryCode);        }        //这个方法是对只能输入数字切小数后面只能有两位小数做判断并且显示到界面上        @Override        public void onKey(int primaryCode, int[] keyCodes) {            LogUtils.toE("onKey:" + primaryCode);            Editable editable = showNumber.getText();            int start = showNumber.getSelectionStart();            int stringLength = editable.length();            LogUtils.toE("kaishi", "start:" + start);            if (primaryCode == -5) {                if (point && ((stringLength - pointNumber - start) <= 0)) {                    pointNumber--;                }                if (start > 0) {                    String atString = editable.charAt(start - 1) + "";                    LogUtils.toE("kaishi", "atString:" + atString);                    if (atString.equals(".")) {                        point = false;                        pointNumber = 0;                    }                }                if (editable != null && start > 0)                    editable.delete(start - 1, start);            }            else {                String select = Character.toString((char) primaryCode);                LogUtils.toE("pointNumber:" + pointNumber);                if (select.equals(".")) {                    if (!point) {                        editable.insert(start, select);                    }                    point = true;                }                else {                    if (point) {                        int spiltNumber = stringLength - pointNumber - start;                        LogUtils.toE("kaishi", "spiltNumber:" + spiltNumber);                        LogUtils.toE("kaishi", "spiltNumber:" + pointNumber);                        LogUtils.toE("kaishi", "spiltNumber:" + start);                        if (spiltNumber > 0) {                            editable.insert(start, select);                        }                        else {                            if (pointNumber < NUMBER) {                                editable.insert(start, select);                                if (pointNumber == NUMBER) {                                    pointNumber = NUMBER;                                }                                else {                                    pointNumber++;                                }                            }                        }                    }                    else {                        editable.insert(start, select);                    }                }            }        }        @Override        public void onText(CharSequence text) {            LogUtils.toE("onText:" + text);        }        @Override        public void swipeLeft() {            LogUtils.toE("swipeLeft:");        }        @Override        public void swipeRight() {            LogUtils.toE("swipeRight:");        }        @Override        public void swipeDown() {            LogUtils.toE("swipeDown:");        }        @Override        public void swipeUp() {            LogUtils.toE("swipeUp:");        }    };}

最后是KeyboardView的一些配置

symbols.xml:数字控件显示

<?xml version="1.0" encoding="utf-8"?>                                                                                                                                
keyboard_button_bg.xml:点击各个位置的显示颜色

<?xml version="1.0" encoding="utf-8"?>                                                                                                                                                                                                                                                                        



更多相关文章

  1. [Android]Android 颜色大全 colors.xml
  2. EditText 只能输入数字字母
  3. Android Studio 获取数字签名信息
  4. android studio系列之获取数字签名
  5. 修改android statusbar颜色
  6. Android中字体颜色的设置
  7. Android知识点记录: 使用代码设置 android 上listView的条目的点
  8. android 字符串、颜色和尺寸
  9. Android 使用android:inputType属性,从EditText中输入获取数字

随机推荐

  1. Android(安卓)sdk tool android 命令参数
  2. android 触发器
  3. Android(安卓)获取版本号
  4. Android(安卓)-Arouter使用说明
  5. android 一些数据转换方法
  6. Android写本地文件
  7. Use adb on Mac OS
  8. Android(安卓)SharedPreferences的使用案
  9. Android布局属性大全
  10. android音频架构