热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android自定义软键盘的实现

先看界面布局文件<?xmlversion1.0encodingutf-8?><LinearLayoutxmlns:androidhttp:sc


先看界面布局文件



 
    
 
    
 
    
 
        
    
 

通过布局文件可以看出界面上有两个输入框,其中一个是密码输入框,界面上还有一个隐藏的键盘控件。
在res下新建xml文件夹,在xml文件夹中新建qwerty.xml和symbols.xml文件. qwerty.xml 是字母键盘布局,symbols.xml 是数字键盘布局,内如如下

qwerty.xml内容



        
                
                
                
                
                
                
                
                
                
                
        
        
                
                
                
                
                
                
                
                
                
        
        
                
                
                
                
                
                
                
                
                
        
        
                
                
                
                
                
        

symbols.xml 内容


        
                
                
                
                
        
        
                
                
                
                
        
        
                
                
                
                
        
        
                
                
                
        

KeydemoActivity.java
package cn.key;
 
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.InputType;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.EditText;
 
public class KeydemoActivity extends Activity {
        private Context ctx;
        private Activity act;
        private EditText edit;
        private EditText edit1;
 
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                ctx = this;
                act = this;
 
                edit = (EditText) this.findViewById(R.id.edit);
                edit.setInputType(InputType.TYPE_NULL);
 
                edit1 = (EditText) this.findViewById(R.id.edit1);
 
                edit.setOnTouchListener(new OnTouchListener() {
                        @Override
                        public boolean onTouch(View v, MotionEvent event) {
                                new KeyboardUtil(act, ctx, edit).showKeyboard();
                                return false;
                        }
                });
 
                edit1.setOnTouchListener(new OnTouchListener() {
                        @Override
                        public boolean onTouch(View v, MotionEvent event) {
                                int inputback = edit1.getInputType();
                                edit1.setInputType(InputType.TYPE_NULL);
                                new KeyboardUtil(act, ctx, edit1).showKeyboard();
                                edit1.setInputType(inputback);
                                return false;
                        }
                });
 
        }
}

KeyboardUtil.java
package cn.key;
 
import java.util.List;
 
import android.app.Activity;
import android.content.Context;
import android.inputmethodservice.Keyboard;
import android.inputmethodservice.KeyboardView;
import android.inputmethodservice.Keyboard.Key;
import android.inputmethodservice.KeyboardView.OnKeyboardActionListener;
import android.text.Editable;
import android.view.View;
import android.widget.EditText;
 
public class KeyboardUtil {
        private Context ctx;
        private Activity act;
        private KeyboardView keyboardView;
        private Keyboard k1;// 字母键盘
        private Keyboard k2;// 数字键盘
        public boolean isnun = false;// 是否数据键盘
        public boolean isupper = false;// 是否大写
 
        private EditText ed;
 
        public KeyboardUtil(Activity act, Context ctx, EditText edit) {
                this.act = act;
                this.ctx = ctx;
                this.ed = edit;
                k1 = new Keyboard(ctx, R.xml.qwerty);
                k2 = new Keyboard(ctx, R.xml.symbols);
                keyboardView = (KeyboardView) act.findViewById(R.id.keyboard_view);
                keyboardView.setKeyboard(k1);
                keyboardView.setEnabled(true);
                keyboardView.setPreviewEnabled(true);
                keyboardView.setOnKeyboardActionListener(listener);
        }
 
        private OnKeyboardActionListener listener = new OnKeyboardActionListener() {
                @Override
                public void swipeUp() {
                }
 
                @Override
                public void swipeRight() {
                }
 
                @Override
                public void swipeLeft() {
                }
 
                @Override
                public void swipeDown() {
                }
 
                @Override
                public void onText(CharSequence text) {
                }
 
                @Override
                public void onRelease(int primaryCode) {
                }
 
                @Override
                public void onPress(int primaryCode) {
                }
 
                @Override
                public void onKey(int primaryCode, int[] keyCodes) {
                        Editable editable = ed.getText();
                        int start = ed.getSelectionStart();
                        if (primaryCode == Keyboard.KEYCODE_CANCEL) {// 完成
                                hideKeyboard();
                        } else if (primaryCode == Keyboard.KEYCODE_DELETE) {// 回退
                                if (editable != null && editable.length() > 0) {
                                        if (start > 0) {
                                                editable.delete(start - 1, start);
                                        }
                                }
                        } else if (primaryCode == Keyboard.KEYCODE_SHIFT) {// 大小写切换
                                changeKey();
                                keyboardView.setKeyboard(k1);
 
                        } else if (primaryCode == Keyboard.KEYCODE_MODE_CHANGE) {// 数字键盘切换
                                if (isnun) {
                                        isnun = false;
                                        keyboardView.setKeyboard(k1);
                                } else {
                                        isnun = true;
                                        keyboardView.setKeyboard(k2);
                                }
                        } else if (primaryCode == 57419) { // go left
                                if (start > 0) {
                                        ed.setSelection(start - 1);
                                }
                        } else if (primaryCode == 57421) { // go right
                                if (start  keylist = k1.getKeys();
                if (isupper) {//大写切换小写
                        isupper = false;
                        for(Key key:keylist){
                                if (key.label!=null && isword(key.label.toString())) {
                                        key.label = key.label.toString().toLowerCase();
                                        key.codes[0] = key.codes[0]+32;
                                }
                        }
                } else {//小写切换大写
                        isupper = true;
                        for(Key key:keylist){
                                if (key.label!=null && isword(key.label.toString())) {
                                        key.label = key.label.toString().toUpperCase();
                                        key.codes[0] = key.codes[0]-32;
                                }
                        }
                }
        }
 
    public void showKeyboard() {
        int visibility = keyboardView.getVisibility();
        if (visibility == View.GONE || visibility == View.INVISIBLE) {
            keyboardView.setVisibility(View.VISIBLE);
        }
    }
     
    public void hideKeyboard() {
        int visibility = keyboardView.getVisibility();
        if (visibility == View.VISIBLE) {
            keyboardView.setVisibility(View.INVISIBLE);
        }
    }
     
    private boolean isword(String str){
            String wordstr = "abcdefghijklmnopqrstuvwxyz";
            if (wordstr.indexOf(str.toLowerCase())>-1) {
                        return true;
                }
            return false;
    }
 
}

源码下载地址:http://download.csdn.net/detail/hfsu0419/4534209


推荐阅读
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 本文介绍了一个Magento模块,其主要功能是实现前台用户利用表单给管理员发送邮件。通过阅读该模块的代码,可以了解到一些有关Magento的细节,例如如何获取系统标签id、如何使用Magento默认的提示信息以及如何使用smtp服务等。文章还提到了安装SMTP Pro插件的方法,并给出了前台页面的代码示例。 ... [详细]
  • 详解Android  自定义UI模板设计_由浅入深
    学习安卓已有一些日子,前段时间整理了不少笔记,但是发现笔记不变分享与携带。今天开始整理博客,全当是与大家分享交流与自身学习理解的过程吧。结合最近在做的一个新闻类app及学习中的问题,一点一点整理一下, ... [详细]
  • 开发笔记:(002)spring容器中bean初始化销毁时执行的方法及其3种实现方式
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了(002)spring容器中bean初始化销毁时执行的方法及其3种实现方式相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
时尚潮_流早覀报_326
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有