热门标签 | 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


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
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社区 版权所有