先看界面布局文件
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
android:id="@+id/edit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
android:id="@+id/edit1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:password="true"/>
android:layout_width="fill_parent"
android:layout_height="wrap_content">
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/lightblack"
android:keyBackground="@drawable/btn_keyboard_key"
android:keyTextColor="@color/white"
android:visibility="gone"/>
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
android:id="@+id/edit"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
android:id="@+id/edit1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:password="true" />
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
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/lightblack"
android:keyBackground="@drawable/btn_keyboard_key"
android:keyTextColor="@color/white"
android:visibility="gone" />
通过布局文件可以看出界面上有两个输入框,其中一个是密码输入框,界面上还有一个隐藏的键盘控件。在res下新建xml文件夹,在xml文件夹中新建qwerty.xml和symbols.xml文件. qwerty.xml 是字母键盘布局,symbols.xml 是数字键盘布局,内如如下
qwerty.xml内容
android:horizontalGap="0.0px"android:verticalGap="0.0px"
xmlns:android="/apk/res/android">
android:keyLabel="q"/>
android:keyLabel="p"/>
android:keyEdgeFlags="left"android:keyLabel="a"/>
android:keyLabel="l"/>
android:keyEdgeFlags="left"android:isModifier="true"
android:isSticky="true"android:keyIcon="@drawable/sym_keyboard_shift"/>
android:keyEdgeFlags="right"android:isRepeatable="true"
android:keyIcon="@drawable/sym_keyboard_delete"/>
android:keyLabel="12#"/>
android:keyLabel=","/>
android:isRepeatable="true"android:keyIcon="@drawable/sym_keyboard_space"/>
android:keyLabel="."/>
android:keyEdgeFlags="right"android:keyLabel="完成"/>
android:horizontalGap="0.0px" android:verticalGap="0.0px"
xmlns:android="/apk/res/android">
android:keyLabel="q" />
android:keyLabel="p" />
android:keyEdgeFlags="left" android:keyLabel="a" />
android:keyLabel="l" />
android:keyEdgeFlags="left" android:isModifier="true"
android:isSticky="true" android:keyIcon="@drawable/sym_keyboard_shift" />
android:keyEdgeFlags="right" android:isRepeatable="true"
android:keyIcon="@drawable/sym_keyboard_delete" />
android:keyLabel="12#" />
android:keyLabel="," />
android:isRepeatable="true" android:keyIcon="@drawable/sym_keyboard_space" />
android:keyLabel="." />
android:keyEdgeFlags="right" android:keyLabel="完成" />
symbols.xml 内容
android:keyWidth="25%p"android:horizontalGap="0px"
android:verticalGap="0px"android:keyHeight="@dimen/key_height">
android:keyIcon="@drawable/sym_keyboard_left"/>
android:keyIcon="@drawable/sym_keyboard_right"/>
android:keyEdgeFlags="right"android:isRepeatable="true"
android:keyLabel="完成"/>
android:keyWidth="25%p" android:horizontalGap="0px"
android:verticalGap="0px" android:keyHeight="@dimen/key_height">
android:keyIcon="@drawable/sym_keyboard_left" />
android:keyIcon="@drawable/sym_keyboard_right" />
android:keyEdgeFlags="right" android:isRepeatable="true"
android:keyLabel="完成" />
KeydemoActivity.java
packagecn.key;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.os.Bundle;
importandroid.text.InputType;
importandroid.view.MotionEvent;
importandroid.view.View;
importandroid.view.View.OnTouchListener;
importandroid.widget.EditText;
publicclassKeydemoActivityextendsActivity{
privateContextctx;
privateActivityact;
privateEditTextedit;
privateEditTextedit1;
@Override
publicvoidonCreate(BundlesavedInstanceState){
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(newOnTouchListener(){
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
newKeyboardUtil(act,ctx,edit).showKeyboard();
returnfalse;
}
});
edit1.setOnTouchListener(newOnTouchListener(){
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
intinputback=edit1.getInputType();
edit1.setInputType(InputType.TYPE_NULL);
newKeyboardUtil(act,ctx,edit1).showKeyboard();
edit1.setInputType(inputback);
returnfalse;
}
});
}
}
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
packagecn.key;
importjava.util.List;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.inputmethodservice.Keyboard;
importandroid.inputmethodservice.KeyboardView;
importandroid.inputmethodservice.Keyboard.Key;
importandroid.inputmethodservice.KeyboardView.OnKeyboardActionListener;
importandroid.text.Editable;
importandroid.view.View;
importandroid.widget.EditText;
publicclassKeyboardUtil{
privateContextctx;
privateActivityact;
privateKeyboardViewkeyboardView;
privateKeyboardk1;//字母键盘
privateKeyboardk2;//数字键盘
publicbooleanisnun=false;//是否数据键盘
publicbooleanisupper=false;//是否大写
privateEditTexted;
publicKeyboardUtil(Activityact,Contextctx,EditTextedit){
this.act=act;
this.ctx=ctx;
this.ed=edit;
k1=newKeyboard(ctx,R.xml.qwerty);
k2=newKeyboard(ctx,R.xml.symbols);
keyboardView=(KeyboardView)act.findViewById(R.id.keyboard_view);
keyboardView.setKeyboard(k1);
keyboardView.setEnabled(true);
keyboardView.setPreviewEnabled(true);
keyboardView.setOnKeyboardActionListener(listener);
}
privateOnKeyboardActionListenerlistener=newOnKeyboardActionListener(){
@Override
publicvoidswipeUp(){
}
@Override
publicvoidswipeRight(){
}
@Override
publicvoidswipeLeft(){
}
@Override
publicvoidswipeDown(){
}
@Override
publicvoidonText(CharSequencetext){
}
@Override
publicvoidonRelease(intprimaryCode){
}
@Override
publicvoidonPress(intprimaryCode){
}
@Override
publicvoidonKey(intprimaryCode,int[]keyCodes){
Editableeditable=ed.getText();
intstart=ed.getSelectionStart();
if(primaryCode==Keyboard.KEYCODE_CANCEL){//完成
hideKeyboard();
}elseif(primaryCode==Keyboard.KEYCODE_DELETE){//回退
if(editable!=null&&editable.length()>0){
if(start>0){
editable.delete(start-1,start);
}
}
}elseif(primaryCode==Keyboard.KEYCODE_SHIFT){//大小写切换
changeKey();
keyboardView.setKeyboard(k1);
}elseif(primaryCode==Keyboard.KEYCODE_MODE_CHANGE){//数字键盘切换
if(isnun){
isnun=false;
keyboardView.setKeyboard(k1);
}else{
isnun=true;
keyboardView.setKeyboard(k2);
}
}elseif(primaryCode==57419){//goleft
if(start>0){
ed.setSelection(start-1);
}
}elseif(primaryCode==57421){//goright
if(start
ed.setSelection(start+1);
}
}else{
editable.insert(start,Character.toString((char)primaryCode));
}
}
};
/**
*键盘大小写切换
*/
privatevoidchangeKey(){
Listkeylist=k1.getKeys();
if(isupper){//大写切换小写
isupper=false;
for(Keykey: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(Keykey:keylist){
if(key.label!=null&&isword(key.label.toString())){
key.label=key.label.toString().toUpperCase();
key.codes[0]=key.codes[0]-32;
}
}
}
}
publicvoidshowKeyboard(){
intvisibility=keyboardView.getVisibility();
if(visibility==View.GONE||visibility==View.INVISIBLE){
keyboardView.setVisibility(View.VISIBLE);
}
}
publicvoidhideKeyboard(){
intvisibility=keyboardView.getVisibility();
if(visibility==View.VISIBLE){
keyboardView.setVisibility(View.INVISIBLE);
}
}
privatebooleanisword(Stringstr){
Stringwordstr="abcdefghijklmnopqrstuvwxyz";
if(wordstr.indexOf(str.toLowerCase())>-1){
returntrue;
}
returnfalse;
}
}
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 < ed.length()) {
ed.setSelection(start + 1);
}
} else {
editable.insert(start, Character.toString((char) primaryCode));
}
}
};
/**
* 键盘大小写切换
*/
private void changeKey() {
List 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;
}
}
源码下载地址:/detail/hfsu0419/4534209