1.首先在res目录下新建文件夹xml,并在xml文件夹下创建3个文件,分别配置省、市、车牌号信息
(1)province_abbreviation.xml
<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:horizontalGap="0.0px"
android:keyHeight="8%p"
android:keyWidth="10%p"
android:verticalGap="0.0px">
<Row android:verticalGap="1%p">
<Key
android:codes="31908"
android:horizontalGap="2%p"
android:keyEdgeFlags="left"
android:keyLabel="粤"
android:keyWidth="8%p" />
<Key
android:codes="20140"
android:horizontalGap="1%p"
android:keyLabel="京"
android:keyWidth="8%p" />
<Key
android:codes="27818"
android:horizontalGap="2%p"
android:keyLabel="沪"
android:keyWidth="8%p" />
<Key
android:codes="27941"
android:horizontalGap="2%p"
android:keyLabel="津"
android:keyWidth="8%p" />
<Key
android:codes="20864"
android:horizontalGap="2%p"
android:keyLabel="冀"
android:keyWidth="8%p" />
<Key
android:codes="26187"
android:horizontalGap="2%p"
android:keyLabel="晋"
android:keyWidth="8%p" />
<Key
android:codes="33945"
android:horizontalGap="2%p"
android:keyLabel="蒙"
android:keyWidth="8%p" />
<Key
android:codes="36797"
android:horizontalGap="2%p"
android:keyLabel="辽"
android:keyWidth="8%p" />
<Key
android:codes="21513"
android:horizontalGap="2%p"
android:keyLabel="吉"
android:keyWidth="8%p" />
<Key
android:codes="40657"
android:horizontalGap="2%p"
android:keyLabel="黑"
android:keyWidth="8%p" />
</Row>
<Row android:verticalGap="1%p">
<Key
android:codes="33487"
android:horizontalGap="6%p"
android:keyEdgeFlags="left"
android:keyLabel="苏"
android:keyWidth="8%p" />
<Key
android:codes="27993"
android:horizontalGap="2%p"
android:keyLabel="浙"
android:keyWidth="8%p" />
<Key
android:codes="30358"
android:horizontalGap="2%p"
android:keyLabel="皖"
android:keyWidth="8%p" />
<Key
android:codes="38397"
android:horizontalGap="2%p"
android:keyLabel="闽"
android:keyWidth="8%p" />
<Key
android:codes="36195"
android:horizontalGap="2%p"
android:keyLabel="赣"
android:keyWidth="8%p" />
<Key
android:codes="40065"
android:horizontalGap="2%p"
android:keyLabel="鲁"
android:keyWidth="8%p" />
<Key
android:codes="35947"
android:horizontalGap="2%p"
android:keyLabel="豫"
android:keyWidth="8%p" />
<Key
android:codes="37122"
android:horizontalGap="2%p"
android:keyLabel="鄂"
android:keyWidth="8%p" />
<Key
android:codes="28248"
android:horizontalGap="2%p"
android:keyLabel="湘"
android:keyWidth="8%p" />
</Row>
<Row android:verticalGap="1%p">
<Key
android:codes="26690"
android:horizontalGap="15%p"
android:keyLabel="桂"
android:keyWidth="8%p" />
<Key
android:codes="26691"
android:horizontalGap="2%p"
android:keyLabel="琼"
android:keyWidth="8%p" />
<Key
android:codes="28189"
android:horizontalGap="2%p"
android:keyLabel="渝"
android:keyWidth="8%p" />
<Key
android:codes="24029"
android:horizontalGap="2%p"
android:keyLabel="川"
android:keyWidth="8%p" />
<Key
android:codes="36149"
android:horizontalGap="2%p"
android:keyLabel="贵"
android:keyWidth="8%p" />
<Key
android:codes="20113"
android:horizontalGap="2%p"
android:keyLabel="云"
android:keyWidth="8%p" />
<Key
android:codes="34255"
android:horizontalGap="2%p"
android:keyLabel="藏"
android:keyWidth="8%p" />
</Row>
<Row>
<Key
android:codes="38485"
android:horizontalGap="25%p"
android:keyLabel="陕"
android:keyWidth="8%p" />
<Key
android:codes="29976"
android:horizontalGap="2%p"
android:keyLabel="甘"
android:keyWidth="8%p" />
<Key
android:codes="38738"
android:horizontalGap="2%p"
android:keyLabel="青"
android:keyWidth="8%p" />
<Key
android:codes="23425"
android:horizontalGap="2%p"
android:keyLabel="宁"
android:keyWidth="8%p" />
<Key
android:codes="26032"
android:horizontalGap="2%p"
android:keyLabel="新"
android:keyWidth="8%p" />
</Row>
</Keyboard>
(2)letters.xml
<?xml version="1.0" encoding="utf-8"?>
<Keyboard
android:keyWidth="10%p" android:keyHeight="8%"
android:horizontalGap="0.0px" android:verticalGap="0.0px"
xmlns:android="http://schemas.android.com/apk/res/android">
<Row android:verticalGap="1%p">
<Key android:codes="81" android:keyLabel="Q"
android:horizontalGap="1%p" android:keyWidth="8%p"
android:keyEdgeFlags="left" />
<Key android:codes="87" android:keyLabel="W"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="69" android:keyLabel="E"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="82" android:keyLabel="R"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="84" android:keyLabel="T"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="89" android:keyLabel="Y"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="85" android:keyLabel="U"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="73" android:keyLabel="I"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="79" android:keyLabel="O"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="80" android:keyLabel="P"
android:horizontalGap="2%p" android:keyWidth="8%p"
android:keyEdgeFlags="right" />
</Row>
<Row android:verticalGap="1%p">
<Key android:codes="65" android:keyLabel="A"
android:horizontalGap="1%p" android:keyWidth="8%p"
android:keyEdgeFlags="left"/>
<Key android:codes="83" android:keyLabel="S"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="68" android:keyLabel="D"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="70" android:keyLabel="F"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="71" android:keyLabel="G"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="72" android:keyLabel="H"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="74" android:keyLabel="J"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="75" android:keyLabel="K"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="76" android:keyLabel="L"
android:horizontalGap="2%p" android:keyWidth="8%p"
/>
<Key android:codes="23398" android:keyLabel="学"
android:horizontalGap="2%p" android:keyWidth="8%p"
android:keyEdgeFlags="right" />
</Row>
<Row >
<Key android:codes="90" android:keyLabel="Z"
android:horizontalGap="1%p" android:keyWidth="8%p"
android:keyEdgeFlags="left"
/>
<Key android:codes="88" android:keyLabel="X"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="67" android:keyLabel="C"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="86" android:keyLabel="V"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="66" android:keyLabel="B"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="78" android:keyLabel="N"
android:horizontalGap="2%p" android:keyWidth="8%p"/>
<Key android:codes="77" android:keyLabel="M"
android:horizontalGap="2%p" android:keyWidth="8%p"
/>
<Key android:codes="28207" android:keyLabel="港"
android:horizontalGap="2%p" android:keyWidth="8%p"
/>
<Key android:codes="28595" android:keyLabel="澳"
android:horizontalGap="2%p" android:keyWidth="8%p"
/>
<Key android:codes="-3"
android:keyIcon="@drawable/ic_delete"
android:horizontalGap="1%p" android:keyWidth="10%p"
android:isRepeatable="true" />
</Row>
</Keyboard>
(3)number_or_letters.xml
<?xml version="1.0" encoding="utf-8"?>
<Keyboard
android:keyWidth="10%p" android:keyHeight="8%"
android:horizontalGap="0.0px" android:verticalGap="0.0px"
xmlns:android="http://schemas.android.com/apk/res/android">
<Row android:verticalGap="1%p">
<Key android:codes="49" android:keyLabel="1"
android:horizontalGap="1%p" android:keyWidth="8%p"
android:keyEdgeFlags="left" />
<Key android:codes="50" android:keyLabel="2"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="51" android:keyLabel="3"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="52" android:keyLabel="4"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="53" android:keyLabel="5"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="54" android:keyLabel="6"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="55" android:keyLabel="7"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="56" android:keyLabel="8"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="57" android:keyLabel="9"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="48" android:keyLabel="0"
android:horizontalGap="2%p" android:keyWidth="8%p"
android:keyEdgeFlags="right"/>
</Row>
<Row android:verticalGap="1%p">
<Key android:codes="81" android:keyLabel="Q"
android:horizontalGap="1%p" android:keyWidth="8%p"
android:keyEdgeFlags="left" />
<Key android:codes="87" android:keyLabel="W"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="69" android:keyLabel="E"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="82" android:keyLabel="R"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="84" android:keyLabel="T"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="89" android:keyLabel="Y"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="85" android:keyLabel="U"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="73" android:keyLabel="I"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="79" android:keyLabel="O"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="80" android:keyLabel="P"
android:horizontalGap="2%p" android:keyWidth="8%p"
android:keyEdgeFlags="right" />
</Row>
<Row android:verticalGap="1%p">
<Key android:codes="65" android:keyLabel="A"
android:horizontalGap="1%p" android:keyWidth="8%p"
android:keyEdgeFlags="left"/>
<Key android:codes="83" android:keyLabel="S"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="68" android:keyLabel="D"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="70" android:keyLabel="F"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="71" android:keyLabel="G"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="72" android:keyLabel="H"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="74" android:keyLabel="J"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="75" android:keyLabel="K"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="76" android:keyLabel="L"
android:horizontalGap="2%p" android:keyWidth="8%p"
/>
<Key android:codes="23398" android:keyLabel="学"
android:horizontalGap="2%p" android:keyWidth="8%p"
android:keyEdgeFlags="right" />
</Row>
<Row >
<Key android:codes="90" android:keyLabel="Z"
android:horizontalGap="1%p" android:keyWidth="8%p"/>
<Key android:codes="88" android:keyLabel="X"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="67" android:keyLabel="C"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="86" android:keyLabel="V"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="66" android:keyLabel="B"
android:horizontalGap="2%p" android:keyWidth="8%p" />
<Key android:codes="78" android:keyLabel="N"
android:horizontalGap="2%p" android:keyWidth="8%p"/>
<Key android:codes="77" android:keyLabel="M"
android:horizontalGap="2%p" android:keyWidth="8%p"
/>
<Key android:codes="28207" android:keyLabel="港"
android:horizontalGap="2%p" android:keyWidth="8%p"
/>
<Key android:codes="28595" android:keyLabel="澳"
android:horizontalGap="2%p" android:keyWidth="8%p"
/>
<Key android:codes="-3"
android:keyIcon="@drawable/ic_delete"
android:horizontalGap="1%p" android:keyWidth="10%p"
android:isRepeatable="true" />
</Row>
</Keyboard>
2.写键盘工具类KeybordUtil
public class Keyboard_Util {
private Context mContext;
private Activity mActivity;
private KeyboardView mKeyboardView;
private EditText mEdit;
private int keybordType;
/**
* 省份简称键盘
*/
private Keyboard province_keyboard;
/**
* 数字与大写字母键盘
*/
private Keyboard number_keyboar;
/**
* 字母键盘
*/
private Keyboard letter_keybord;
public Keyboard_Util(Activity activity, EditText edit) {
mActivity = activity;
mContext = activity;
mEdit = edit;
province_keyboard = new Keyboard(mContext, R.xml.province_abbreviation);
number_keyboar = new Keyboard(mContext, R.xml.number_or_letters);
letter_keybord = new Keyboard(mContext, R.xml.letters);
mKeyboardView = (KeyboardView) activity.findViewById(R.id.keyboard_view);
mKeyboardView.setEnabled(true);
mKeyboardView.setPreviewEnabled(false);
mKeyboardView.setOnKeyboardActionListener(listener);
}
private KeyboardView.OnKeyboardActionListener listener = new KeyboardView.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 = mEdit.getText();
int start = mEdit.getSelectionStart();
if (primaryCode == -3) {
if (editable != null && editable.length() > 0) {
if (start > 0) {
editable.delete(start - 1, start);
}
}
} else {
if (keybordType==0||keybordType==1){
editable.replace(0,editable.length(),Character.toString((char) primaryCode));
}else {
editable.insert(start, Character.toString((char) primaryCode));
}
}
}
};
/**
* 切换键盘
*
* @param keybordType
*/
public void changeKeybord(int keybordType) {
this.keybordType=keybordType;
switch (keybordType) {
case 0:
mKeyboardView.setKeyboard(province_keyboard);
break;
case 1:
mKeyboardView.setKeyboard(letter_keybord);
break;
case 2:
mKeyboardView.setKeyboard(number_keyboar);
break;
}
}
/**
* 软键盘展示状态
*/
public boolean isShow() {
return mKeyboardView.getVisibility() == View.VISIBLE;
}
/**
* 软键盘展示
*/
public void showKeyboard() {
int visibility = mKeyboardView.getVisibility();
if (visibility == View.GONE || visibility == View.INVISIBLE) {
mKeyboardView.setVisibility(View.VISIBLE);
}
}
/**
* 软键盘隐藏
*/
public void hideKeyboard() {
int visibility = mKeyboardView.getVisibility();
if (visibility == View.VISIBLE) {
mKeyboardView.setVisibility(View.INVISIBLE);
}
}
/**
* 禁掉系统软键盘
*/
public void hideSoftInputMethod() {
mActivity.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
int currentVersion = android.os.Build.VERSION.SDK_INT;
String methodName = null;
if (currentVersion >= 16) {
// 4.2
methodName = "setShowSoftInputOnFocus";
} else if (currentVersion >= 14) {
// 4.0
methodName = "setSoftInputShownOnFocus";
}
if (methodName == null) {
mEdit.setInputType(InputType.TYPE_NULL);
} else {
Class<EditText> cls = EditText.class;
Method setShowSoftInputOnFocus;
try {
setShowSoftInputOnFocus = cls.getMethod(methodName,
boolean.class);
setShowSoftInputOnFocus.setAccessible(true);
setShowSoftInputOnFocus.invoke(mEdit, false);
} catch (NoSuchMethodException e) {
mEdit.setInputType(InputType.TYPE_NULL);
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
3.布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.a086.customkeybord.MainActivity">
<EditText
android:maxLength="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/et_province"
android:text="粤"
/>
<EditText
android:maxLength="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/et_city"
android:text="B"
android:layout_toRightOf="@+id/et_province"
android:layout_marginLeft="5dp"
/>
<EditText
android:maxLength="6"
android:hint="车牌号"
android:layout_toRightOf="@+id/et_city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/et_searchtxt"
/>
<android.inputmethodservice.KeyboardView
android:layout_alignParentBottom="true"
android:id="@+id/keyboard_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:focusable="true"
android:focusableInTouchMode="true"
android:background="#999999"
android:keyBackground="@drawable/keybord_bg"
android:keyTextSize="16sp"
android:keyTextColor="#000"
android:visibility="gone" />
</RelativeLayout>
4.使用
public class MainActivity extends AppCompatActivity {
private Keyboard_Util keyboardUtil;
private EditText et_searchtxt;
private EditText et_province;
private EditText et_city;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_province=findViewById(R.id.et_province);
et_city=findViewById(R.id.et_city);
et_searchtxt = (EditText) findViewById(R.id.et_searchtxt);
et_province.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
keyboardUtil = new Keyboard_Util(MainActivity.this, et_province);
keyboardUtil.hideSoftInputMethod();
keyboardUtil.changeKeybord(0);
keyboardUtil.showKeyboard();
return false;
}
});
et_province.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
et_city.requestFocus();
et_city.setFocusable(true);
keyboardUtil = new Keyboard_Util(MainActivity.this, et_city);
keyboardUtil.hideSoftInputMethod();
keyboardUtil.changeKeybord(1);
keyboardUtil.showKeyboard();
}
});
et_city.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
keyboardUtil = new Keyboard_Util(MainActivity.this, et_city);
keyboardUtil.hideSoftInputMethod();
keyboardUtil.changeKeybord(1);
keyboardUtil.showKeyboard();
return false;
}
});
et_city.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (s.length()>0){
et_searchtxt.requestFocus();
et_searchtxt.setFocusable(true);
keyboardUtil = new Keyboard_Util(MainActivity.this, et_searchtxt);
keyboardUtil.hideSoftInputMethod();
keyboardUtil.changeKeybord(2);
keyboardUtil.showKeyboard();
}
}
});
et_searchtxt.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
keyboardUtil = new Keyboard_Util(MainActivity.this, et_searchtxt);
keyboardUtil.hideSoftInputMethod();
keyboardUtil.changeKeybord(2);
keyboardUtil.showKeyboard();
return false;
}
});
}
}