android内置键盘实例
来源:互联网 发布:官方原版windows xp 编辑:程序博客网 时间:2024/05/22 06:33
android内置键盘开发,刚听到的时候其实很懵逼的 。一听这个感觉是要从系统层入手。其实内置在应用中的keyboard没有想象中的那么难。
1、 布局文件 系统提供的KeyboardView 属性都是基本属性
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FCFCFC" > <RelativeLayout android:id="@+id/top_layout" android:layout_width="match_parent" android:layout_height="50dip" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:background="#3E98FF" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="50dip" android:gravity="center" android:text="添加车辆" android:textColor="#FFFFFF" android:textSize="16sp" /> </RelativeLayout> <RelativeLayout android:id="@+id/gsxx_layout" android:layout_width="match_parent" android:layout_height="60dip" android:layout_alignParentLeft="true" android:layout_below="@+id/top_layout" android:background="#FFFFFF" > <TextView android:id="@+id/imageView1" android:layout_width="60dip" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_marginLeft="10dip" android:gravity="center_vertical" android:text="品牌:" android:textColor="#2F2F2F" android:textSize="15sp" tools:ignore="ContentDescription" /> <EditText android:id="@+id/tv_carbrand" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginRight="10dip" android:layout_toRightOf="@+id/imageView1" android:background="@color/transparent" android:gravity="center_vertical" android:hint="输入车辆品牌" android:textColor="#2F2F2F" android:textSize="15sp" /> <View android:layout_width="match_parent" android:layout_height="0.5dp" android:layout_alignParentBottom="true" android:background="#E4E4E4" /> </RelativeLayout> <RelativeLayout android:id="@+id/gsdt_layout" android:layout_width="match_parent" android:layout_height="60dip" android:layout_alignParentLeft="true" android:layout_below="@+id/gsxx_layout" android:background="#FFFFFF" > <TextView android:id="@+id/imageView3" android:layout_width="60dip" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_marginLeft="10dip" android:gravity="center_vertical" android:text="型号:" android:textColor="#2F2F2F" android:textSize="15sp" tools:ignore="ContentDescription" /> <EditText android:id="@+id/tv_cartype" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginRight="10dip" android:layout_toRightOf="@+id/imageView3" android:background="@color/transparent" android:gravity="center_vertical" android:hint="输入车辆型号" android:textColor="#2F2F2F" android:textSize="15sp" /> <View android:layout_width="match_parent" android:layout_height="0.5dp" android:layout_alignParentBottom="true" android:background="#E4E4E4" /> </RelativeLayout> <RelativeLayout android:id="@+id/gswh_layout" android:layout_width="match_parent" android:layout_height="60dip" android:layout_alignParentLeft="true" android:layout_below="@+id/gsdt_layout" android:background="#FFFFFF" > <TextView android:id="@+id/imageView7" android:layout_width="60dip" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_marginLeft="10dip" android:gravity="center_vertical" android:text="车牌:" android:textColor="#2F2F2F" android:textSize="15sp" tools:ignore="ContentDescription" /> <EditText android:id="@+id/tv_carplate" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginRight="10dip" android:layout_toRightOf="@+id/imageView7" android:background="@color/transparent" android:gravity="center_vertical" android:hint="输入车辆车牌" android:textColor="#2F2F2F" android:textSize="15sp" /> <View android:layout_width="match_parent" android:layout_height="0.5dp" android:layout_alignParentBottom="true" android:background="#E4E4E4" /> </RelativeLayout> <Button android:id="@+id/tjcl_btn" android:layout_width="match_parent" android:layout_height="45dp" android:layout_alignParentLeft="true" android:layout_below="@+id/gswh_layout" android:layout_margin="15dp" android:gravity="center" android:text="添加" android:textColor="#FFFFFF" android:textSize="15sp" /> <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" > <android.inputmethodservice.KeyboardView android:id="@+id/keyboard_view" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:focusable="true" android:focusableInTouchMode="true" android:background="@color/gray" android:paddingTop="5dp" android:paddingBottom="5dp" android:paddingRight="20dp" android:keyTextColor="@color/keybord_bg" android:keyBackground="@drawable/btn_keyboard_key" android:visibility="gone" /> </RelativeLayout></RelativeLayout>
2、 键盘英文布局xml
<?xml version="1.0" encoding="UTF-8"?><Keyboard xmlns:android="http://schemas.android.com/apk/res/android" android:horizontalGap="0.0px" android:keyHeight="@dimen/key_height" android:keyWidth="6.8%p" android:verticalGap="20px" > <Row> <Key android:codes="48" android:horizontalGap="4%p" android:keyEdgeFlags="left" android:keyIcon="@drawable/zero" /> <Key android:codes="49" android:horizontalGap="2.8%p" android:keyIcon="@drawable/one" /> <Key android:codes="50" android:horizontalGap="2.8%p" android:keyIcon="@drawable/two" /> <Key android:codes="51" android:horizontalGap="2.8%p" android:keyIcon="@drawable/three" /> <Key android:codes="52" android:horizontalGap="2.8%p" android:keyIcon="@drawable/four" /> <Key android:codes="53" android:horizontalGap="2.8%p" android:keyIcon="@drawable/five" /> <Key android:codes="54" android:horizontalGap="2.8%p" android:keyIcon="@drawable/six" /> <Key android:codes="55" android:horizontalGap="2.8%p" android:keyIcon="@drawable/seven" /> <Key android:codes="56" android:horizontalGap="2.8%p" android:keyIcon="@drawable/eight" /> <Key android:codes="57" android:horizontalGap="2.8%p" android:keyEdgeFlags="right" android:keyIcon="@drawable/nice" /> </Row> <Row> <Key android:codes="81" android:horizontalGap="4%p" android:keyEdgeFlags="left" android:keyIcon="@drawable/q" /> <Key android:codes="87" android:horizontalGap="2.8%p" android:keyIcon="@drawable/w" /> <Key android:codes="69" android:horizontalGap="2.8%p" android:keyIcon="@drawable/e" /> <Key android:codes="82" android:horizontalGap="2.8%p" android:keyIcon="@drawable/r" /> <Key android:codes="84" android:horizontalGap="2.8%p" android:keyIcon="@drawable/t" /> <Key android:codes="89" android:horizontalGap="2.8%p" android:keyIcon="@drawable/y" /> <Key android:codes="85" android:horizontalGap="2.8%p" android:keyIcon="@drawable/u" /> <Key android:codes="73" android:horizontalGap="2.8%p" android:keyIcon="@drawable/i" /> <Key android:codes="79" android:horizontalGap="2.8%p" android:keyIcon="@drawable/o" /> <Key android:codes="80" android:horizontalGap="2.8%p" android:keyEdgeFlags="right" android:keyIcon="@drawable/p" /> </Row> <Row> <Key android:codes="65" android:horizontalGap="8.2%p" android:keyEdgeFlags="left" android:keyIcon="@drawable/a"/> <Key android:codes="83" android:horizontalGap="2.8%p" android:keyIcon="@drawable/s"/> <Key android:codes="68" android:horizontalGap="2.8%p" android:keyIcon="@drawable/d"/> <Key android:codes="70" android:horizontalGap="2.8%p" android:keyIcon="@drawable/f"/> <Key android:codes="71" android:horizontalGap="2.8%p" android:keyIcon="@drawable/g" /> <Key android:codes="72" android:horizontalGap="2.8%p" android:keyIcon="@drawable/h"/> <Key android:codes="74" android:horizontalGap="2.8%p" android:keyIcon="@drawable/j"/> <Key android:codes="75" android:horizontalGap="2.8%p" android:keyIcon="@drawable/k"/> <Key android:codes="76" android:horizontalGap="2.8%p" android:keyEdgeFlags="right" android:keyIcon="@drawable/l"/> </Row> <Row> <Key android:codes="-2" android:isModifier="true" android:isSticky="true" android:keyEdgeFlags="right" android:keyIcon="@drawable/province" android:horizontalGap="2%p" android:keyWidth="8%p"/> <Key android:horizontalGap="7.5%p" android:codes="90" android:keyIcon="@drawable/z" /> <Key android:horizontalGap="2.8%p" android:codes="88" android:keyIcon="@drawable/x" /> <Key android:horizontalGap="2.8%p" android:codes="67" android:keyIcon="@drawable/c" /> <Key android:horizontalGap="2.8%p" android:codes="86" android:keyIcon="@drawable/v" /> <Key android:horizontalGap="2.8%p" android:codes="66" android:keyIcon="@drawable/b" /> <Key android:horizontalGap="2.8%p" android:codes="78" android:keyIcon="@drawable/n" /> <Key android:horizontalGap="2.8%p" android:codes="77" android:keyIcon="@drawable/m" /> <Key android:codes="-5" android:isRepeatable="true" android:keyEdgeFlags="right" android:keyIcon="@drawable/delete" android:horizontalGap="7.5%p" android:keyWidth="8%p" /> </Row></Keyboard>
中文布局xml
<?xml version="1.0" encoding="utf-8"?><Keyboard xmlns:android="http://schemas.android.com/apk/res/android" android:keyWidth="6.8%p" android:horizontalGap="20px" android:verticalGap="20px" android:keyHeight="@dimen/key_height"> <Row> <Key android:codes="-48" android:horizontalGap="4%p" android:keyEdgeFlags="left" android:keyIcon="@drawable/bj"/> <Key android:codes="-49" android:horizontalGap="2.8%p" android:keyIcon="@drawable/tj" /> <Key android:codes="-50" android:horizontalGap="2.8%p" android:keyIcon="@drawable/hbs" /> <Key android:codes="-51" android:horizontalGap="2.8%p" android:keyIcon="@drawable/sd" /> <Key android:codes="-52" android:horizontalGap="2.8%p" android:keyIcon="@drawable/sx" /> <Key android:codes="-53" android:horizontalGap="2.8%p" android:keyIcon="@drawable/nmg" /> <Key android:codes="-54" android:horizontalGap="2.8%p" android:keyIcon="@drawable/ll" /> <Key android:codes="-55" android:horizontalGap="2.8%p" android:keyIcon="@drawable/jl" /> <Key android:codes="-56" android:horizontalGap="2.8%p" android:keyIcon="@drawable/hlj" /> <Key android:codes="-57" android:horizontalGap="2.8%p" android:keyEdgeFlags="right" android:keyIcon="@drawable/sh" /> </Row> <Row> <Key android:codes="-58" android:horizontalGap="4%p" android:keyEdgeFlags="left" android:keyIcon="@drawable/js" /> <Key android:codes="-59" android:horizontalGap="2.8%p" android:keyIcon="@drawable/zj" /> <Key android:codes="-60" android:horizontalGap="2.8%p" android:keyIcon="@drawable/ah" /> <Key android:codes="-61" android:horizontalGap="2.8%p" android:keyIcon="@drawable/fj" /> <Key android:codes="-62" android:horizontalGap="2.8%p" android:keyIcon="@drawable/jx" /> <Key android:codes="-63" android:horizontalGap="2.8%p" android:keyIcon="@drawable/yu" /> <Key android:codes="-64" android:horizontalGap="2.8%p" android:keyIcon="@drawable/hb" /> <Key android:codes="-65" android:horizontalGap="2.8%p" android:keyIcon="@drawable/hn" /> <Key android:codes="-66" android:horizontalGap="2.8%p" android:keyIcon="@drawable/gd" /> <Key android:codes="-67" android:horizontalGap="2.8%p" android:keyEdgeFlags="right" android:keyIcon="@drawable/gx" /> </Row> <Row> <Key android:codes="-68" android:horizontalGap="13%p" android:keyEdgeFlags="left" android:keyIcon="@drawable/cq"/> <Key android:codes="-69" android:horizontalGap="2.8%p" android:keyIcon="@drawable/sc"/> <Key android:codes="-70" android:horizontalGap="2.8%p" android:keyIcon="@drawable/gz"/> <Key android:codes="-71" android:horizontalGap="2.8%p" android:keyIcon="@drawable/yn"/> <Key android:codes="-72" android:horizontalGap="2.8%p" android:keyIcon="@drawable/xz" /> <Key android:codes="-73" android:horizontalGap="2.8%p" android:keyIcon="@drawable/sxs"/> <Key android:codes="-74" android:horizontalGap="2.8%p" android:keyIcon="@drawable/gs"/> <Key android:codes="-75" android:horizontalGap="2.8%p" android:keyIcon="@drawable/qh"/> </Row> <Row> <Key android:codes="-2" android:isModifier="true" android:isSticky="true" android:keyEdgeFlags="right" android:keyIcon="@drawable/abc" android:horizontalGap="2%p" android:keyWidth="8%p"/> <Key android:horizontalGap="12.3%p" android:codes="-76" android:keyIcon="@drawable/hns" /> <Key android:horizontalGap="2.8%p" android:codes="-77" android:keyIcon="@drawable/xj" /> <Key android:horizontalGap="2.8%p" android:codes="-78" android:keyIcon="@drawable/xg" /> <Key android:horizontalGap="2.8%p" android:codes="-79" android:keyIcon="@drawable/am" /> <Key android:horizontalGap="2.8%p" android:codes="-80" android:keyIcon="@drawable/tb" /> <Key android:horizontalGap="2.8%p" android:codes="-81" android:keyIcon="@drawable/lx" /> <Key android:codes="-5" android:isRepeatable="true" android:keyEdgeFlags="right" android:keyIcon="@drawable/delete" android:horizontalGap="12.3%p" android:keyWidth="8%p" /> </Row></Keyboard>
keyheight:代表按键的高度,取值同上。
horizontalGap:代表按键前的间隙(水平方向)
keyWidth:代表按键的宽度,可以为精确值或者相对
verticalGap:代表按键前的间隙(垂直方向)
keyEdgeFlags:指定按键的对齐指令,取值为left或者right
keyIcon:代表按键显示的图标内容(一般不用图片显示会很模糊)
keyOutputText:指定按键输出的文本内容,取值为字
isRepeatable:指定按键是否是可重复的(长按重复按键功能)
codes:代表按键对应的输出值(数字英文对应相应的ASCII表也可以自己填写判断)
3、KeyboardUtils键盘控制类
package zw.com.keybord;import java.util.HashMap;import java.util.List;import java.util.Map;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 static KeyboardView keyboardView; private Keyboard k1;// 字母键盘 private Keyboard k2;// 数字键盘 public boolean isnun = false;// 是否省份 public boolean isupper = false;// 是否大写 private EditText ed; private Map<Integer, String> map ; public KeyboardUtil(Activity act, Context ctx, EditText edit) { this.act = act; this.ctx = ctx; this.ed = edit; putMap(); k1 = new Keyboard(ctx, R.xml.qwerty); k2 = new Keyboard(ctx, R.xml.symbols); keyboardView = (KeyboardView) act.findViewById(R.id.keyboard_view); keyboardView.setKeyboard(k2); keyboardView.setEnabled(true); keyboardView.setPreviewEnabled(true); keyboardView.setOnKeyboardActionListener(listener); } private void putMap(){ map = new HashMap<Integer, String>(); map.put(-48, "京"); map.put(-49, "津"); map.put(-50, "冀"); map.put(-51, "鲁"); map.put(-52, "晋"); map.put(-53, "蒙"); map.put(-54, "辽"); map.put(-55, "吉"); map.put(-56, "黑"); map.put(-57, "沪"); map.put(-58, "苏"); map.put(-59, "浙"); map.put(-60, "皖"); map.put(-61, "闽"); map.put(-62, "赣"); map.put(-63, "豫"); map.put(-64, "鄂"); map.put(-65, "湘"); map.put(-66, "粤"); map.put(-67, "桂"); map.put(-68, "渝"); map.put(-69, "川"); map.put(-70, "贵"); map.put(-71, "云"); map.put(-72, "藏"); map.put(-73, "陕"); map.put(-74, "甘"); map.put(-75, "青"); map.put(-76, "琼"); map.put(-77, "新"); map.put(-78, "港"); map.put(-79, "澳"); map.put(-80, "台"); map.put(-81, "宁"); } 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(k2); } else { isnun = true; keyboardView.setKeyboard(k1); } } else if (primaryCode < -47 && primaryCode > -82) { // 如果返回codes在-47和-82之间 添加指定中文 editable.insert(start, map.get(primaryCode)); }else { editable.insert(start, Character.toString((char) primaryCode)); } } }; /** * 键盘大小写切换 */ private void changeKey() { List<Key> 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.GONE);// } } private boolean isword(String str){ String wordstr = "abcdefghijklmnopqrstuvwxyz"; if (wordstr.indexOf(str.toLowerCase())>-1) { return true; } return false; }}
4、主页面
package zw.com.keybord;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.inputmethod.InputMethodManager;import android.widget.EditText;import android.widget.Toast;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * Created by 15090 on 2016/11/27. */public class MainActivity extends Activity implements View.OnClickListener,View.OnTouchListener{ private EditText tv_carplate, tv_cartype, tv_carbrand; private KeyboardUtil mKeyboardUtil; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { tv_carplate = (EditText) findViewById(R.id.tv_carplate); tv_cartype = (EditText) findViewById(R.id.tv_cartype); tv_carbrand = (EditText) findViewById(R.id.tv_carbrand); tv_carplate.setOnTouchListener(this); tv_carbrand.setOnTouchListener(this); tv_cartype.setOnTouchListener(this); } @Override public void onClick(View key) { switch (key.getId()) { case R.id.tjcl_btn: EditText editText_1 = (EditText) findViewById(R.id.tv_carbrand); String str_pp = editText_1.getText().toString(); if (null != str_pp && str_pp.trim().length() > 0) { EditText editText_2 = (EditText) findViewById(R.id.tv_cartype); String str_xh = editText_2.getText().toString(); if (null != str_xh && str_xh.trim().length() > 0) { EditText editText_3 = (EditText) findViewById(R.id.tv_carplate); String str_cp = editText_3.getText().toString(); Pattern pattern = Pattern .compile("^[\u4e00-\u9fa5]{1}[A-Z]{1}[A-Z_0-9]{5}$"); Matcher matcher = pattern.matcher(str_cp); if (matcher.matches()) {// addCar(str_pp, str_xh, str_cp); Toast.makeText(this,"输入成功",Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this,"车牌号格式不对!",Toast.LENGTH_SHORT).show(); }// if (null != str_cp && str_cp.trim().length() > 0) {// Toast.makeText(AddCarActivity.this, "添加车辆成功!",// Toast.LENGTH_SHORT).show();// addCar(str_pp, str_xh, str_cp);// } else {// Toast.makeText(AddCarActivity.this, "车牌不能为空!",// Toast.LENGTH_SHORT).show();// } } else { Toast.makeText(this,"型号不能为空!",Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(this,"品牌不能为空!",Toast.LENGTH_SHORT).show(); } break; default: break; } } @Override public boolean onTouch(View v, MotionEvent arg1) { switch (v.getId()) { case R.id.tv_carplate: int inputback = tv_carplate.getInputType(); tv_carplate.setInputType(InputType.TYPE_NULL); if (mKeyboardUtil == null) { mKeyboardUtil = new KeyboardUtil(this, getApplicationContext(), tv_carplate); mKeyboardUtil.showKeyboard(); } else { mKeyboardUtil.showKeyboard(); } manageSoftInput(getApplicationContext(), tv_carbrand, true); manageSoftInput(getApplicationContext(), tv_cartype, true); tv_carplate.setInputType(inputback); break; case R.id.tv_carbrand: if (mKeyboardUtil != null) { mKeyboardUtil.hideKeyboard(); } case R.id.tv_cartype: if (mKeyboardUtil != null) { mKeyboardUtil.hideKeyboard(); } break; default: break; } return false; } /** * 键盘操作 * * @param isColse * 是否要关闭 true 关闭,false 打开 */ public static void manageSoftInput(Context ctx, EditText editText, boolean isColse) { InputMethodManager imm = (InputMethodManager) ctx .getSystemService(Context.INPUT_METHOD_SERVICE); if (isColse) { imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); } else { imm.showSoftInput(editText, 0); } }}
好了,应用内置键盘就这样结束了。
源码连接
0 0
- android内置键盘实例
- android 实现自定义键盘的实例
- 禁用mac 内置键盘
- 笔记本禁用内置键盘方法
- Android键盘事件监听器实例-能移动的飞机
- 启动内置android内置浏览器
- IOS 键盘隐藏实例
- 键盘钩子 实例!!!!
- android 键盘
- android 键盘
- android 键盘
- Android键盘
- Android键盘
- android 键盘
- Android 键盘
- Android键盘
- android键盘
- 打开关闭Macbook Air (Pro)内置键盘
- 买买返说明
- Protobuf总结
- 深入浅出Docker(六):像谷歌一样部署你的应用
- iOS 开发 UIView和CALayer详解
- Android性能优化第(五)篇---Android UI渲染机制
- android内置键盘实例
- 2000元的H5外包到月入300万的微信掘金之旅
- Android性能优化之Bitmap导致的内存溢出
- git-submodule的常用操作
- 数据结构整理
- 核函数,再生核Hilbert空间,表示定理
- AJAX 封装
- 小马哥---高仿苹果6sp 主板型号Q39B-8A1-HD-V2.0.1-20150806刷机 拆解主板图
- jquery.tmpl()(一)