日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android自定义数字键盘和字母键盘,Android自定义键盘的实现(数字键盘和字母键盘)...

發布時間:2024/4/14 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android自定义数字键盘和字母键盘,Android自定义键盘的实现(数字键盘和字母键盘)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android自定義鍵盤的實現(數字鍵盤和字母鍵盤)

發布時間:2020-09-04 03:18:48

來源:腳本之家

閱讀:100

作者:浪淘沙xud

在項目中,產品對于輸入方式會有特殊的要求,需要對輸入方式增加特定的限制,這就需要采用自定義鍵盤。本文主要講述數字鍵盤和字母鍵盤的自定義實現。

項目地址:https://github.com/xudjx/djkeyboard

鍵盤效果:

自定義鍵盤的實現步驟如下:

自定義CustomKeyboard, 繼承自系統Keyboard,實現KeyboardView.OnKeyboardActionListener相關接口,以處理用戶的點擊回調;

自定義CustomKeyboardView, 繼承自KeyboardView,實現自定義鍵盤繪制;

創建KeyboardManager, 用于處理自定義鍵盤的顯示以及和輸入UI的交互

自定義CustomKeyboard

Android系統Keyboard的構造方法如下:

/**

* Creates a keyboard from the given xml key layout file.

* @param context the application or service context

* @param xmlLayoutResId the resource file that contains the keyboard layout and keys.

*/

public Keyboard(Context context, int xmlLayoutResId) {

this(context, xmlLayoutResId, 0);

}

/**

* Creates a keyboard from the given xml key layout file. Weeds out rows

* that have a keyboard mode defined but don't match the specified mode.

* @param context the application or service context

* @param xmlLayoutResId the resource file that contains the keyboard layout and keys.

* @param modeId keyboard mode identifier

* @param width sets width of keyboard

* @param height sets height of keyboard

*/

public Keyboard(Context context, @XmlRes int xmlLayoutResId, int modeId, int width,

int height) {

...

}

其中,參數xmlLayoutResId是必須的,另外還可以通過計算系統鍵盤的高度來設定自定義鍵盤的高度。

xmlLayoutRes的格式如下:

android:keyHeight="49dp"

android:horizontalGap="0.1333%p"

android:verticalGap="1px"

xmlns:android="http://schemas.android.com/apk/res/android">

android:keyLabel="1" />

android:isRepeatable="true"/>

...

詳細的數字鍵盤和字母鍵盤xmlLayoutRes資源文件可以從以下鏈接獲取:

數字鍵盤xmlLayoutRes

字母鍵盤xmlLayoutRes

CustomKeyboard主要目的就是賦予xmlLayoutRes并實現特定按鍵的點擊處理,其主要重載的方法是onKey(int primaryCode, int[] keyCodes)。詳細代碼如下:

public abstract class BaseKeyboard extends Keyboard implements KeyboardView.OnKeyboardActionListener{

@Override

public void onKey(int primaryCode, int[] keyCodes) {

if(null != mEditText && mEditText.hasFocus() && !handleSpecialKey(primaryCode)) {

Editable editable = mEditText.getText();

int start = mEditText.getSelectionStart();

int end = mEditText.getSelectionEnd();

if (end > start){

editable.delete(start,end);

}

if(primaryCode == KEYCODE_DELETE) {

if(!TextUtils.isEmpty(editable)) {

if(start > 0) {

editable.delete(start-1,start);

}

}

}else if(primaryCode == getKeyCode(R.integer.hide_keyboard)){

hideKeyboard();

}else {

editable.insert(start,Character.toString((char) primaryCode));

}

}

}

public abstract boolean handleSpecialKey(int primaryCode);

}

如上所示是BaseKeyboard,數字鍵盤和字母鍵盤需要繼承它,并實現public abstract boolean handleSpecialKey(int primaryCode)方法。

自定義CustomKeyboardView

KeyboardView 是承載不同的keyboard并繪制keyboard, 是鍵盤布局的繪制板, 并與系統交互。通過繼承KeyboardView自定義CustomKeyboardView,可以對按鍵樣式實現自定義。考察KeyboardView的源碼,發現其UI樣式都是private類型,這就需要通過反射的方式獲取特定的UI屬性,并重新進行賦值,同時重載onDraw()方法,在onDraw()中重新繪制。

詳細代碼可以參考github源碼: BaseKeyBoardView源碼

自定義鍵盤的UI效果如下:

數字鍵盤

字母鍵盤

創建KeyboardManager

主要處理以下功能邏輯:

綁定EditText和Keyboard,監聽EditText的OnFocusChangeListener,處理鍵盤彈出和鍵盤掩藏;

處理系統鍵盤和自定義鍵盤之間的切換關系;

處理鍵盤區域其他自定義view的顯示,比如需要讓鍵盤自動搜索功能時,可在manager中進行相關處理

以綁定EditText為例:

public void bindToEditor(EditText editText, BaseKeyboard keyboard) {

hideSystemSoftKeyboard(editText);

editText.setTag(R.id.bind_keyboard_2_editor, keyboard);

if (keyboard.getKeyStyle() == null) {

keyboard.setKeyStyle(mDefaultKeyStyle);

}

editText.setOnFocusChangeListener(editorFocusChangeListener);

}

private final View.OnFocusChangeListener editorFocusChangeListener = new View.OnFocusChangeListener() {

@Override

public void onFocusChange(final View v, boolean hasFocus) {

if (v instanceof EditText) {

if (hasFocus) {

v.postDelayed(new Runnable() {

@Override

public void run() {

showSoftKeyboard((EditText) v);

}

},300);

} else {

hideSoftKeyboard();

}

}

}

};

public void showSoftKeyboard(EditText editText) {

mRootView.addOnLayoutChangeListener(mOnLayoutChangeListener);

BaseKeyboard keyboard = getBindKeyboard(editText);

if (keyboard == null) {

Log.e(TAG, "edit text not bind to keyboard");

return;

}

keyboard.setEditText(editText);

keyboard.setNextFocusView(mKeyboardWithSearchView.getEditText());

initKeyboard(keyboard);

...

}

鍵盤的使用方式非常簡單, 通過KeyboardManager實現調用

數字鍵盤:

KeyboardManager keyboardManagerNumber = new KeyboardManager(this);

keyboardManagerNumber.bindToEditor(editText2, new NumberKeyboard(context,NumberKeyboard.DEFAULT_NUMBER_XML_LAYOUT));

字母鍵盤:

KeyboardManager keyboardManagerAbc = new KeyboardManager(this);

keyboardManagerAbc.bindToEditor(editText1, new ABCKeyboard(context, ABCKeyboard.DEFAULT_ABC_XML_LAYOUT));

至此,自定義鍵盤的實現就介紹完了,文中介紹的更多還是實現的思路,具體實現可以參考github,有需要的用戶也可以直接修改項目的源碼。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

總結

以上是生活随笔為你收集整理的android自定义数字键盘和字母键盘,Android自定义键盘的实现(数字键盘和字母键盘)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。