参考:
http://blog.csdn.net/hfsu0419/article/details/7924673
布局文件activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/edit1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none" />
<RelativeLayout
android:layout_width="match_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="@android:color/darker_gray"
android:keyTextColor="#00ff00"
android:keyPreviewLayout="@layout/keyborad_preview_layout"
android:keyPreviewHeight="40dip"
android:visibility="gone" />
</RelativeLayout>
</LinearLayout>
预览文件keyborad_preview_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textColor="#ffffff"
android:background="@drawable/prewlayout_bg"
android:gravity="center"
android:minHeight="0dip"
android:minWidth="0dip"
android:textSize="20sp"
/>
样式
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >
<solid android:color="#ff000000"/>
<stroke android:color="#9900f010" android:width="2dip"/>
</shape>
键盘布局文件
<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:horizontalGap="0.0px"
android:keyHeight="50dp"
android:keyWidth="10.000002%p"
android:verticalGap="0.0px" >
<Row>
<Key
android:codes="49"
android:keyEdgeFlags="left"
android:keyLabel="1" />
<Key
android:codes="50"
android:keyLabel="2" />
<Key
android:codes="51"
android:keyLabel="3" />
<Key
android:codes="52"
android:keyLabel="4" />
<Key
android:codes="53"
android:keyLabel="5" />
<Key
android:codes="54"
android:keyLabel="6" />
<Key
android:codes="55"
android:keyLabel="7" />
<Key
android:codes="56"
android:keyLabel="8" />
<Key
android:codes="57"
android:keyLabel="9" />
<Key
android:codes="48"
android:keyEdgeFlags="right"
android:keyLabel="0" />
</Row>
<Row>
<Key
android:codes="113"
android:keyEdgeFlags="left"
android:keyLabel="q" />
<Key
android:codes="119"
android:keyLabel="w" />
<Key
android:codes="101"
android:keyLabel="e" />
<Key
android:codes="114"
android:keyLabel="r" />
<Key
android:codes="116"
android:keyLabel="t" />
<Key
android:codes="121"
android:keyLabel="y" />
<Key
android:codes="117"
android:keyLabel="u" />
<Key
android:codes="105"
android:keyLabel="i" />
<Key
android:codes="111"
android:keyLabel="o" />
<Key
android:codes="112"
android:keyEdgeFlags="right"
android:keyLabel="p" />
</Row>
<Row>
<Key
android:codes="97"
android:keyEdgeFlags="left"
android:keyLabel="a" />
<Key
android:codes="115"
android:keyLabel="s" />
<Key
android:codes="100"
android:keyLabel="d" />
<Key
android:codes="102"
android:keyLabel="f" />
<Key
android:codes="103"
android:keyLabel="g" />
<Key
android:codes="104"
android:keyLabel="h" />
<Key
android:codes="106"
android:keyLabel="j" />
<Key
android:codes="107"
android:keyLabel="k" />
<Key
android:codes="108"
android:keyLabel="l" />
<Key
android:codes="42"
android:keyEdgeFlags="right"
android:keyLabel="@string/at_flag" />
</Row>
<Row>
<Key
android:codes="-1"
android:isModifier="true"
android:isSticky="true"
android:keyEdgeFlags="left"
android:keyLabel="大写"
android:keyWidth="14.999998%p" />
<Key
android:codes="122"
android:keyLabel="z" />
<Key
android:codes="120"
android:keyLabel="x" />
<Key
android:codes="99"
android:keyLabel="c" />
<Key
android:codes="118"
android:keyLabel="v" />
<Key
android:codes="98"
android:keyLabel="b" />
<Key
android:codes="110"
android:keyLabel="n" />
<Key
android:codes="109"
android:keyLabel="m" />
<Key
android:codes="-5"
android:isRepeatable="true"
android:keyEdgeFlags="right"
android:keyLabel="退格"
android:keyWidth="14.999998%p" />
</Row>
<Row android:rowEdgeFlags="bottom" >
<Key
android:codes="44"
android:keyEdgeFlags="left"
android:keyLabel=","
android:keyWidth="25%p" />
<Key
android:codes="32"
android:isRepeatable="true"
android:keyLabel="空格"
android:keyWidth="25%p" />
<Key
android:codes="46"
android:keyLabel="."
android:keyWidth="25%p" />
<Key
android:codes="45"
android:keyLabel="-"
android:keyWidth="25%p" />
<Key
android:codes="95"
android:keyLabel="_"
android:keyWidth="25%p" />
<Key
android:codes="-3"
android:keyEdgeFlags="right"
android:keyLabel="完成"
android:keyWidth="25%p" />
</Row>
</Keyboard>
KeyboardUtil.java
package com.app.mobile.keyboard;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import android.app.Activity;
import android.inputmethodservice.Keyboard;
import android.inputmethodservice.Keyboard.Key;
import android.inputmethodservice.KeyboardView;
import android.inputmethodservice.KeyboardView.OnKeyboardActionListener;
import android.text.Editable;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
public class KeyboardUtil {
private KeyboardView keyboardView;
private Keyboard k1;
public boolean isupper = false;// 是否大写
boolean isShow = false;
private EditText inputEditText;
public KeyboardUtil( EditText edit) {
this.inputEditText = edit;
Activity act = (Activity) this.inputEditText.getContext();
k1 = new Keyboard(act, R.xml.custom_softkeyboard_v1);
keyboardView = (KeyboardView) act.findViewById(R.id.keyboard_view);
keyboardView.setKeyboard(k1);
keyboardView.setEnabled(true);
keyboardView.setOnKeyboardActionListener(listener);
setSoftKeyboradHide(act, edit);
}
private void setSoftKeyboradHide(Activity ctx,EditText edit)
{
ctx.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
try {
Class<EditText> cls = EditText.class;
Method setShowSoftInputOnFocus = null;
String method_setSoftInputOnFocus = "setShowSoftInputOnFocus";
if(android.os.Build.VERSION.SDK_INT>16)
{
method_setSoftInputOnFocus = "setSoftInputOnFocus";
}
setShowSoftInputOnFocus = cls.getMethod(method_setSoftInputOnFocus, boolean.class);
setShowSoftInputOnFocus.setAccessible(false);
setShowSoftInputOnFocus.invoke(edit, false);
} catch (Exception e) {
e.printStackTrace();
}
}
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) {
checkIShowPrewiew(primaryCode);
}
private void checkIShowPrewiew(int primaryCode)
{
List<Integer> list = Arrays.asList(Keyboard.KEYCODE_CANCEL,Keyboard.KEYCODE_DELETE,Keyboard.KEYCODE_SHIFT,46,32,44);
if(list.contains(primaryCode))
{
keyboardView.setPreviewEnabled(false);
}else{
keyboardView.setPreviewEnabled(true);
}
}
@Override
public void onKey(int primaryCode, int[] keyCodes)
{
checkIShowPrewiew(primaryCode);
Log.i("KeyBoard", "primaryCode="+primaryCode);
Editable editable = inputEditText.getText();
int start = inputEditText.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 == 57419) { // go left
if (start > 0) {
inputEditText.setSelection(start - 1);
}
}
else if (primaryCode == 57421)
{ // go right
if (start < inputEditText.length()) {
inputEditText.setSelection(start + 1);
}
}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 if (key.label.toString().equals("小写")) {
key.label = "大写";
}
}
} 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;
} else if (key.label.toString().equals("大写")) {
key.label = "小写";
}
}
}
}
public void showKeyboard() {
int visibility = keyboardView.getVisibility();
if (visibility == View.GONE || visibility == View.INVISIBLE) {
keyboardView.setVisibility(View.VISIBLE);
isShow = true;
}
}
public void hideKeyboard()
{
int visibility = keyboardView.getVisibility();
if (visibility == View.VISIBLE) {
keyboardView.setVisibility(View.INVISIBLE);
isShow = false;
}
}
private boolean isword(String str) {
String wordstr = "abcdefghijklmnopqrstuvwxyz";
if (wordstr.indexOf(str.toLowerCase()) > -1) {
return true;
}
return false;
}
}
Activity
package com.app.mobile.keyboard;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.text.InputType;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.EditText;
public class MainActivity extends ActionBarActivity {
private Activity act;
private EditText edit;
private KeyboardUtil util;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
act = this;
edit = (EditText) this.findViewById(R.id.edit1);
edit.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
showKeyBoardView();
return false;
}
});
}
private void showKeyBoardView()
{
int inputType = edit.getInputType();
edit.setInputType(InputType.TYPE_NULL);
if(util==null)
{
util=new KeyboardUtil(edit);
}
if(!util.isShow)
{
util.showKeyboard();
}
edit.setInputType(inputType);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK){
if(util!=null && util.isShow){
util.hideKeyboard();
}else{
finish();
}
return false;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}