Android 九宫格物理键盘数字英文切换
前几天接到个任务,让android原生的输入法支持物理按键,同时在状态栏体现。
一开始直接在拉丁输入法LatinIME.java类中处理,然后客户要求不能在输入法中处理,于是对InputMethodService.java进行处理。
/*begin add by csc*/private long timeDown,timeUp;private int count,typeCount ;private String input;private int lastKeyCode;private boolean isLongPressed = false;private boolean isDown = false;private static final long DELAY_TIME = 700;private boolean isInput = true;InputConnection inputConnection;// add by csc/*end add by csc*/
public boolean onKeyDown(int keyCode, KeyEvent event) {/*begin add by csc*/if(Settings.Global.getInt(getApplicationContext().getContentResolver(), "aa_key_switch_case_function_enabled",0)==1) {final EditorInfo ei = getCurrentInputEditorInfo();if (ei.inputType != 524289 && ei.inputType != InputType.TYPE_NULL && ei.inputType != InputType.TYPE_CLASS_NUMBER && ei.inputType != InputType.TYPE_NUMBER_FLAG_SIGNED && ei.inputType != InputType.TYPE_NUMBER_FLAG_DECIMAL && ei.inputType != InputType.TYPE_CLASS_PHONE) {if (isInput && keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9 || keyCode == KeyEvent.KEYCODE_STAR || keyCode == KeyEvent.KEYCODE_F3 || keyCode == KeyEvent.KEYCODE_POUND) {handler.removeCallbacks(runnableUp);if (typeCount != 0) {if (!isLongPressed) {timeDown = System.currentTimeMillis();if (/*keyCode == KeyEvent.KEYCODE_F3||*/lastKeyCode != 0 && lastKeyCode != keyCode && timeDown - timeUp < DELAY_TIME && lastKeyCode != KeyEvent.KEYCODE_0 && !isDown) {if (typeCount == 2) {input = input.toUpperCase();}if (DEBUG)Log.d("chenshichun", " " + this.getClass().getCanonicalName() + " :::::input::::" + input);inputConnection.commitText(input, 1);count = 0;}if (!isDown && keyCode != KeyEvent.KEYCODE_F3)handler.postDelayed(runnableDown, DELAY_TIME);isDown = true;switch (keyCode) {case KeyEvent.KEYCODE_0:input = "0";return true;case KeyEvent.KEYCODE_1:input = "1";return true;case KeyEvent.KEYCODE_2:input = "2";return true;case KeyEvent.KEYCODE_3:input = "3";return true;case KeyEvent.KEYCODE_4:input = "4";return true;case KeyEvent.KEYCODE_5:input = "5";return true;case KeyEvent.KEYCODE_6:input = "6";return true;case KeyEvent.KEYCODE_7:input = "7";return true;case KeyEvent.KEYCODE_8:input = "8";return true;case KeyEvent.KEYCODE_9:input = "9";return true;case KeyEvent.KEYCODE_STAR:input = "*";return true;case KeyEvent.KEYCODE_POUND:input = "#";return true;}} else {return true;}}if (keyCode == KeyEvent.KEYCODE_F3) {return true;}}}}/*end add by csc*/if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {if (handleBack(false)) {event.startTracking();return true;}return false;}return doMovementKey(keyCode, event, MOVEMENT_DOWN);}
public boolean onKeyUp(int keyCode, KeyEvent event) {/*begin add by csc*/if(Settings.Global.getInt(getApplicationContext().getContentResolver(), "aa_key_switch_case_function_enabled",0)==1) {final EditorInfo ei = getCurrentInputEditorInfo();if (ei.inputType != 524289 && ei.inputType != InputType.TYPE_NULL && ei.inputType != InputType.TYPE_CLASS_NUMBER && ei.inputType != InputType.TYPE_NUMBER_FLAG_SIGNED && ei.inputType != InputType.TYPE_NUMBER_FLAG_DECIMAL && ei.inputType != InputType.TYPE_CLASS_PHONE) {if (isInput) {isDown = false;if (typeCount != 0 && /*keyCode != KeyEvent.KEYCODE_POUND && */keyCode != KeyEvent.KEYCODE_F3 &&(keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9 || keyCode == KeyEvent.KEYCODE_STAR || keyCode == KeyEvent.KEYCODE_POUND)) {long nowTime = System.currentTimeMillis();inputConnection = getCurrentInputConnection();if (isLongPressed) {isLongPressed = false;} else {handler.removeCallbacks(runnableDown);switch (keyCode) {case KeyEvent.KEYCODE_0:if (nowTime - timeDown < DELAY_TIME) {handler.removeCallbacks(runnableDown);input = " ";inputConnection.commitText(input, 1);}break;case KeyEvent.KEYCODE_1:switch (count % 3) {case 0:input = ",";break;case 1:input = ".";break;case 2:input = "@";break;}break;case KeyEvent.KEYCODE_2:switch (count % 3) {case 0:input = "a";break;case 1:input = "b";break;case 2:input = "c";break;}break;case KeyEvent.KEYCODE_3:switch (count % 3) {case 0:input = "d";break;case 1:input = "e";break;case 2:input = "f";break;}break;case KeyEvent.KEYCODE_4:switch (count % 3) {case 0:input = "g";break;case 1:input = "h";break;case 2:input = "i";break;}break;case KeyEvent.KEYCODE_5:switch (count % 3) {case 0:input = "j";break;case 1:input = "k";break;case 2:input = "l";break;}break;case KeyEvent.KEYCODE_6:switch (count % 3) {case 0:input = "m";break;case 1:input = "n";break;case 2:input = "o";break;}break;case KeyEvent.KEYCODE_7:switch (count % 4) {case 0:input = "p";break;case 1:input = "q";break;case 2:input = "r";break;case 3:input = "s";break;}break;case KeyEvent.KEYCODE_8:switch (count % 3) {case 0:input = "t";break;case 1:input = "u";break;case 2:input = "v";break;}break;case KeyEvent.KEYCODE_9:switch (count % 4) {case 0:input = "w";break;case 1:input = "x";break;case 2:input = "y";break;case 3:input = "z";break;}break;case KeyEvent.KEYCODE_STAR:switch (count % 2) {case 0:input = ".";break;case 1:input = ",";break;}break;case KeyEvent.KEYCODE_POUND:input = "#";break;}if (typeCount == 2) {input = input.toUpperCase();}inputConnection.setComposingText(input, 1);handler.removeCallbacks(runnableUp);handler.postDelayed(runnableUp, DELAY_TIME);count++;isLongPressed = false;timeUp = System.currentTimeMillis();lastKeyCode = keyCode;}}if (keyCode == KeyEvent.KEYCODE_F3) {switch (typeCount) {case 0:typeCount = 1;break;case 1:typeCount = 2;break;case 2:typeCount = 0;break;}input = "";Intent intent = new Intent("INPUT_STATUS_CHANGE");intent.putExtra("INPUT_STATUS", typeCount);sendBroadcast(intent);}}}}/*end add by csc*/if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.isTracking()&& !event.isCanceled()) {return handleBack(true);}return doMovementKey(keyCode, event, MOVEMENT_UP);}
/*begin add by csc*/Handler handler = new Handler();Runnable runnableDown = new Runnable() {@Overridepublic void run() {try {inputConnection.commitText(input, 1);if(DEBUG)Log.d("chenshichun"," "+this.getClass().getCanonicalName()+" :::::runnableDown::::"+input);isLongPressed = true;} catch (Exception e) {e.printStackTrace();System.out.println("exception...");}}};Runnable runnableUp = new Runnable() {@Overridepublic void run() {try {if(typeCount==2){input = input.toUpperCase();}inputConnection.commitText(input, 1);if(DEBUG)Log.d("chenshichun"," "+this.getClass().getCanonicalName()+" :::::runnableUp::::"+input);count = 0;} catch (Exception e) {e.printStackTrace();System.out.println("exception...");}}};/*end add by csc*/
因为监听不到长按事件,所以在每次down的时候都当长按处理,handler.postDelayed(runnableDown, DELAY_TIME); 每次up的时候先handler.removeCallbacks(runnableDown);这时候如果抬手时间大于DELAY_TIME就会当长按处理,在电话,计算器等只需要输入数字的界面就将该功能屏蔽,通过输入类型来判断即可,这里524289是计算器读出来的类型,源码中找不到就直接写数值了。
ei.inputType != 524289 && ei.inputType != InputType.TYPE_NULL && ei.inputType != InputType.TYPE_CLASS_NUMBER && ei.inputType != InputType.TYPE_NUMBER_FLAG_SIGNED && ei.inputType != InputType.TYPE_NUMBER_FLAG_DECIMAL && ei.inputType != InputType.TYPE_CLASS_PHONE
当切换大小写的时候在PhoneStatusBar.java接受广播
else if("INPUT_STATUS_CHANGE".equals(action)){// add by cscint inputStatus = intent.getIntExtra("INPUT_STATUS",0);switch (inputStatus){case 0:mInputStatus.setText("");break;case 1:mInputStatus.setText(R.string.input_lower);break;case 2:mInputStatus.setText(R.string.input_case);break;}}else if ("INPUT_ON_OR_FALSE".equals(action)){// add by cscboolean putStatusOn = intent.getBooleanExtra("INPUT_STATUS_ON",false);mInputStatus.setVisibility(putStatusOn?View.VISIBLE:View.GONE);}
其中INPUT_ON_OR_FALSE这个广播是设置里面发出的,设置里面加了一个这个功能是否启用的开关,对应
Settings.Global.getInt(getApplicationContext().getContentResolver(), "aa_key_switch_case_function_enabled",0)==1
还需要在statusbar.xml里面加一个控件
<TextViewandroid:id="@+id/input_status"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center_vertical"android:text="@string/input_case"android:visibility="gone"/>
后面发现在短信界面联想功能会乱,于是实体按键的时候就把联想功能去掉:
在拉丁输入法LatinIME.java里面修改:
if (!/*latinIme.mSettings.getCurrent().isSuggestionsEnabledPerUserSettings()*/false) {// mod by cscreturn;}
Android 九宫格物理键盘数字英文切换相关推荐
- android关闭物理键盘,设备有物理键盘,如何关掉软键盘?
我使用的是android版的手持终端,带有物理键盘,在app中需要关掉软键盘,反复试验了以下几种方法,都没有效果,请问如何解决? static hideSoftInput(){ var Context ...
- Android获取物理键盘按键的keycode
有时候,我们需要获取键盘按键的keycode值来对某个按键设置相应功能,这时候可以通过以下几种方法获取按键的keycode值: 1.通过onKeyDown()方法打印按键的keycode值 在Acti ...
- android accessibility 模拟键盘事件_H5 键盘兼容性小结
在 H5 项目中,我们会经常遇到页面中存在单个甚至多个 input/textarea 输入框与底部固定元素的布局情况.在 input/textarea 输入框获取焦点时,会自动触发键盘弹起,而键盘弹出 ...
- Android 输入框(EditText)的输入限制,数字英文邮箱,可见\隐藏切换,踩过的坑!
目录 一.输入框的输入限制 1.在xml文件里通过设置属性限制输入 2.在代码里动态设置输入限制 二.密码可见性切换和遇到的坑 最近做到了登录注册模块的各种输入判定,监听等等,因为需求上的需要,还是搞 ...
- appium android数字字母切换键,Android自定义键盘:数字键盘和字母键盘
在项目中,产品对于输入方式会有特殊的要求,需要对输入方式增加特定的限制,这就需要采用自定义键盘.本文主要讲述数字键盘和字母键盘的自定义实现. 自定义键盘的实现步骤如下: 自定义CustomKeyboa ...
- android动态设置EditText显示英文带数字键盘
开启软键盘和隐藏软键盘 //软键盘控制器 InputMethodManagerimm =(InputMethodManager)getActivity().getSystemService(Conte ...
- android 物理键盘 字符,Android物理键盘事件解析
前言 Android设备连接物理键盘其实是个挺小众的需求,其实Android设备本身就是支持物理键盘,dispatchKeyEvent()这个方法就可以监听物理键盘,这里提供一个封装的类,解析键盘事件 ...
- 解决Android 5.1物理键盘与软键盘的同时使用
在android 5.1系统中插入扫码枪物理设备后,软键盘无法弹出的问题. 1. 在代码frameworks/base/services/core/java/com/android/server/wm ...
- android外接键盘打汉字,Android在外接物理键盘时,如何强制调用系统软键盘
Android在外接物理键盘时,如何强制调用系统软键盘? 第一次写,写的不好请见谅 参考: 物理键盘映射过程: 手机/system/usr/keylayout/*.kl :内核将keyCode映射成有 ...
最新文章
- golang中的jwt
- 12C OCP 1Z0-063 题库(8月以前)
- pajek软件使用方法_使用Jco远程连接SAP软件系统方法
- 《ArcGIS Runtime SDK for Android开发笔记》——(3)、ArcGIS Runtime SDK概述
- 剪纸风格的美妆海报设计,你试过吗?
- android 更新apk 应用为安装,应用未安装!从Android Studio构建安装APK时出错 - java
- 泱脏武器库之 CVE 2021-4034 Polkit 提权小结
- varchar和varchar2的区别
- 软件测试简历上的职业技能怎么写,软件测试岗位个人技能范文
- linux shell题库,shell习题-30
- vi 和 vim 编辑器的使用
- 报错笔记-[error] 1615#0: *14 open() “/usr/local/nginx/html/course/zk.jpg“ failed (2: No such file or dir
- 背包模块的设计(日常任务模块, 武器排行榜, 战术, 英雄战斗力, 活动模块)
- Android 向联系人名单新加联系人(添加名称和电话号码两项)
- 使用QPST刷机时报ERROR: function: main:314 Could not connect to \\.\COM3
- 树莓派 EC20 mini pcie 开机自动拨号
- 一文看尽2019 MWC十大新机
- easyX像素鸟PixelBird
- 【手把手教你学51单片机】中断的优先级
- CAPL编程中的思想:if...else...判断语句还能这么玩
热门文章
- 外包,你是外包不是正式员工,麻烦不要随便吃公司零食
- 【论文解读】文本分类上分利器:Bert微调trick大全
- 【Node.js】论一个低配版Web实时通信库是如何实现的1( WebSocket篇)
- ubuntu git clone 报错error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected
- 在Android Studio上编写第一个安卓程序
- Android安卓——Android程序生命周期
- 每天重启mycat的好处_路由器需要每天都关吗?其实很多人都弄错了
- 哪款国产ESD二极管可直接替代LC3311CCW?
- 【本/硕毕业生】开题报告及论文指导思路和撰写事项的整理
- 橙狮Scratch编程