Android自定義View接收輸入法輸入的內(nèi)容
前言
可能對于很多新人來講,看到這個題目,想到的能接收輸入法輸入的內(nèi)容大概只有EditText和TextView這兩個控件了,其實不然,只要是View的子類,都可以接收輸入法輸入的內(nèi)容。
現(xiàn)在我們一步一步來實現(xiàn),第一步我們得有一個View的子類。
實現(xiàn)方法
//首先我們得重寫View中的一個方法,返回true,就是讓這個View變成文本可編輯的狀態(tài),默認返回false。
@Override
public boolean onCheckIsTextEditor() {
return true;
}
//第二個就是重寫
public InputConnection onCreateInputConnection(EditorInfo outAttrs);
//方法,需要返回一個InputConnect對象,這個是和輸入法輸入內(nèi)容的橋梁。
// outAttrs就是我們需要設置的輸入法的各種類型最重要的就是:
outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI;
outAttrs.inputType = InputType.TYPE_NULL;
這里我只是隨便設置,重要的是返回的InputConnect對象。
//一般我們都是些一個BaseInputConnection的子類,而BaseInputConnection是實現(xiàn)了InputConnection接口的。
需要注意的就是幾個方法注意重寫。
@Override
public boolean commitText(CharSequence text, int newCursorPosition) {
Log.d("hickey", "commitText:" + text + "\t" + newCursorPosition);
if (containsEmoji(text.toString())) {
Log.d("hickey", "send emoji");
return true;
}
if (mPlayer != null && mPlayFragment.isInputMethodStatus()) {
Log.d("hickey", "text:" + text);
mPlayerView.sendCharEvent(text.toString());
}
return true;
}
note:這個是當輸入法輸入了字符,包括表情,字母、文字、數(shù)字和符號。我們可以通過text篩選出我們不想讓顯示到自定義view上面。
//有文本輸入,當然也有按鍵輸入,也別注意的是有些輸入法輸入數(shù)字并非用commitText方法傳遞,而是用按鍵來代替,比如KeyCode_1是代表1等。
@Override
public boolean sendKeyEvent(KeyEvent event) {
/** 當手指離開的按鍵的時候 */
if (event.getAction() == KeyEvent.ACTION_DOWN) {
Log.d("hickey", "sendKeyEvent:KeyCode=" + event.getKeyCode());
if (event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
mPlayerView.sendFunctionKeyCodeEvent(KeyEvent.KEYCODE_DEL);
} else if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
mPlayerView.sendFunctionKeyCodeEvent(KeyEvent.KEYCODE_ENTER);
mPlayFragment.setInputMethodStatus(false, 1);
} else {
mPlayerView.sendCharKeyCodeEvent(event.getKeyCode());
}
}
return true;
}
note:這里我只做了刪除,回車按鍵的處理,由于會觸發(fā)動作按下和松開兩次,所以在這里只做了按下的處理。
//當然刪除的時候也會觸發(fā)
@Override
public boolean deleteSurroundingText(int beforeLength, int afterLength) {
Log.d("hickey", "deleteSurroundingText " + "beforeLength=" + beforeLength + " afterLength=" + afterLength);
mPlayerView.sendFunctionKeyCodeEvent(KeyEvent.KEYCODE_DEL);
return true;
}
@Override
public boolean finishComposingText() {
//結束組合文本輸入的時候
Log.d("hickey", "finishComposingText");
return true;
}
//這個方法基本上會出現(xiàn)在切換輸入法類型,點擊回車(完成、搜索、發(fā)送、下一步)點擊輸入法右上角隱藏按鈕會觸發(fā)。
這里引申出多個問題,比如說當我們點擊View上的時候,需要彈出輸入法咋辦?
我們可以通過InputMethodManager來控制輸入法彈起和縮回。
InputMethodHelper(Context mContext) {
inputMethodManager = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
}
public synchronized static InputMethodHelper getInstance(Context mContext) {
synchronized (InputMethodHelper.class) {
if (inputMethodHelper == null) {
inputMethodHelper = new InputMethodHelper(mContext);
}
return inputMethodHelper;
}
}
/**
* 顯示軟鍵盤
*
* @param view
*/
public void showSoftInput(View view) {
inputMethodManager.showSoftInput(view, 0);
}
/**
* 隱藏輸入法
*/
public void hideSoftInput(View view) {
if (inputMethodManager.isActive()) {
Log.d("hickey", "hideSoftInput:" + "hideSoftInputFromWindow");
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
在非全屏狀態(tài)下,我們可以通過布局大小的改變來監(jiān)聽輸入法的彈起和縮回,但是在全屏狀態(tài)下呢,抱歉,目前是不可以的。比如說用戶點擊了輸入法的隱藏按鈕,只會觸發(fā)finishComposingText這個方法,但是其他時候也會觸發(fā)此方法,所以想通過此方法監(jiān)聽輸入法縮回是不可行的,InputMethodManager也沒有提供相關的API,試過獲取IMM的提供的
public boolean isActive(View view){
return inputMethodManager.isActive(view);
}
public boolean isActive(){
return inputMethodManager.isActive();
}
public boolean isWatchingCursor (View view){
return inputMethodManager.isWatchingCursor(view);
}
public boolean isAcceptingText(){
return inputMethodManager.isAcceptingText();
}
都沒有任何成效。
還有一種情況是當前Activity退出了,輸入法還健在,且輸入了沒有任何內(nèi)容。而且我們試過所有隱藏輸入法的方法,都無法正常的隱藏輸入法。
這里告訴告訴大家一個比較賤的方法,在輸入法健在的時候,我們點擊返回按鈕,都會主動隱藏輸入法,再次點擊才會把按鍵事件分發(fā)傳遞到Activity上。
所以,我們就需要模擬一個返回的事件。
new Thread(new Runnable() {
@Override
public void run() {
RedFinger.simulationEvent = true;
Instrumentation instrumentation = new Instrumentation();
instrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
}
}).start();
//這里弄了個bool標志是防止輸入已經(jīng)隱藏還會分發(fā)返回按鍵事件到Activity上,所以需要在可能退出到的頁面上做處理。
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對各位Android開發(fā)者們能帶來一定的幫助,如果有疑問大家可以留言交流。
- Android 顯示和隱藏輸入法實現(xiàn)代碼
- Android程序打開和對輸入法的操作(打開/關閉)
- Android中Activity啟動默認不顯示輸入法解決方法
- Android的文本和輸入之創(chuàng)建輸入法教程
- Android輸入法彈出時覆蓋輸入框問題的解決方法
- Android中系統(tǒng)默認輸入法設置的方法(輸入法的顯示和隱藏)
- Android監(jiān)聽輸入法彈窗和關閉的實現(xiàn)方法
- Android 點擊屏幕空白處收起輸入法軟鍵盤(手動打開)
- Android InputMethodManager輸入法簡介
- Android實現(xiàn)彈出輸入法時頂部固定中間部分上移的效果
相關文章
MPAndroidChart繪制自定義運動數(shù)據(jù)圖表示例詳解
這篇文章主要為大家介紹了MPAndroidChart繪制自定義運動數(shù)據(jù)圖表示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09
Github簡單易用的?Android?ViewModel?Retrofit框架
這篇文章主要介紹了Github簡單易用的Android?ViewModel?Retrofit框架,RequestViewMode有自動對LiveData進行緩存管理,每個retrofit api接口復用一個livedata的優(yōu)勢。下文具體詳情,感興趣的小伙伴可以參考一下2022-06-06
Android用StaticLayout實現(xiàn)文字轉(zhuǎn)化為圖片效果(類似長微博發(fā)送)
這篇文章主要給大家介紹了關于Android利用StaticLayout實現(xiàn)文字轉(zhuǎn)化為圖片效果,實現(xiàn)的效果類似我們常見的長微博效果,文中給出了詳細的示例代碼供大家參考學習,需要的朋友們下面來一起看看吧。2017-08-08
Android 點擊ImageButton時有“按下”的效果的實現(xiàn)
這篇文章主要介紹了 Android 點擊ImageButton時有“按下”的效果的實現(xiàn)的相關資料,需要的朋友可以參考下2017-03-03
Android之ArcSlidingHelper制作圓弧滑動效果
這篇文章主要介紹了Android之ArcSlidingHelper制作圓弧滑動效果,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08
Android 實現(xiàn)視頻字幕Subtitle和橫豎屏切換示例
下面小編就為大家分享一篇Android 實現(xiàn)視頻字幕Subtitle和橫豎屏切換示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01

