android 输入法 确定按钮,Android 输入法笔记
首先,目前只是記錄一些開發輸入法時遇過的坑。
一、關于中文輸入法
1.Android中文輸入法資料實在是少的可憐,唯一能用的開源中文輸入法就是谷歌中文輸入法,但那也是很舊的版本了,只有26鍵并且詞庫也比較過時。
2.項目初期曾以此為基礎開發26鍵中文鍵盤,其實感覺效果還算理想。
a.在GitHub中下載谷歌拼音輸入法源碼,然后跑通后開始研究源碼。
b.界面是鍵盤模板布局SkbTemplate寫的,沒有可視化界面,定制化也不高,所以建議還是layout自定義布局。
c.其中候選詞和聯想詞也是用的鍵盤模塊(候選詞視圖會在界面最上層),可棄用,使用layout自定義布局。
d.此源碼有一個BUG,拼音輸入“NSS”會崩潰,原因在輸入法框架的cpp中,暫未找到修復方法,只能輸入時優化此問題。
3.中文9鍵和詞庫記憶等功能,如果愿意花大量心思去研究也是可以搞出來的
4.后來使用的是第三方的收費SDK,就不再研究具體輸入法的核心代碼了。
2.生命周期
image.png
切換本輸入法時(顯示鍵盤前):onCreate->onBindInput->onStartInput
顯示鍵盤過程:onEvaluateInputViewShown(調用2次) -> onCreateInputView-> onCreateCandidatesView ->
onStartInputView -> onWindowShown -> onComputeInsets(調用2次)
關閉鍵盤過程:->onFinishInputView-> onWindowHidden -> onComputeInsets
切換其他輸入法:onDestroy - > onFinishInput
方法簡介:
onCreate()
輸入法創建過程時首先調用該方法.由于常駐在進程當中,在沒有OnDestory之前只會調用該方法一次
onInitializeInterface()
緊隨著onCreate()方法后調用,用于界面初始化以及用于service運行過程中配置信息發生改變的情況(橫豎屏轉換等,會觸發onConfigurationChanged()方法)
onBindInput
用于發現客戶端的變化,當新的客戶端綁定到輸入法時,該方法會被調用,在輸入法第一次啟動時,會馬上調用onStartInput方法獲取編輯框數據,否則,先調用onFinishInput方法,而后調用onStartInput方法
onStartInput
走完onBindInput(),會調用該方法.用于處理客戶端發起的輸入會話,輸入法可以獲取到相對應的編輯框的信息,用于決定展示什么類型的鍵盤.在輸入法周期中會頻繁的調用.
onEvaluateInputViewShown()
此方法在顯示鍵盤時,首次打開會在onCreateInputView()之前調用,因此需要注意初始化過程中的順序問題,避免空指針。
onCreateInputView()
在該生命周期中主要用于初始化跟input area區域相關的類和變量.
onCreateCandidateView()
在該生命周期中主要用于初始化跟candidate area區域相關的類和變量.
onCreateExtractTextView
在輸入法全屏模式下會調用,用于創建并返回用于顯示(extracted text)文本信息的區域視圖,返回的視圖必須包含ExtractEditText,且ID值為inputExtractEditText,默認情況下橫屏模式時,輸入法為全屏效果。
onConfigureWindow()
通常在窗口發生改變時候調用,比如在獲取到輸入視圖時調用和失去輸入視圖時.
onStartInputView()
輸入視圖正在顯示并且編輯框輸入已經獲取焦點時回調該方法用于創建并返回(input area)輸入區域的層次視圖,該方法只被調用一次(輸入區域第一次顯示時),該方法可以返回null,此時輸入法不存在輸入區域,InputMethodService的默認方法實現返回值為空,想要改變已經創建的輸入區域視圖,我們可以調用setInputView(View)方法,想要控制何時顯示輸入視圖,我們可以實現onEvaluateInputViewShown方法,該方法用來判斷輸入區域是否應該顯示,在updateInputViewShown方法中會調用onEvaluateInputViewShown方法來判斷是否顯示輸入區域.
onStartInputView()
輸入視圖正在顯示并且編輯框輸入已經獲取焦點時回調該方法,onStartInputView方法總會在onStartInput,onConfigureWindow()方法之后被調用.一般情況下普通的設置可以在onStartInput方法中進行,在onStartInputView方法中進行視圖相關的設置,開發者應該保證onCreateInputView方法在該方法被調用之前調用.
onStartCandidiateView()
候選視圖正在顯示時回調該方法,必須確保候選區域的資源已經初始化過了.一般情況普通的設置可以在onStartInput方法中進行,在onStartCandidatesView方法中進行視圖相關的設置,開發者應該保證onCreateCandidatesView方法在該方法被調用之前調用。
onWindowShown()
在onstartinputview方法之后調用,調用該方法時,表示整個輸入法是可見的.
hideWindow()
當輸入法window失去焦點時調用該方法.
onWindowHidden()
當視圖有可見轉換為不可見時,調用該方法.一般跟onWindowShown配合使用。
onFinishCandidatesView()
當候選詞視圖即將被隱藏或者切換到另外的編輯框時調用該方法,finishingInput為true,onFinishInput方法會接著被調用.
onFinishInputView()
當候選詞視圖即將被隱藏或者切換到另外的編輯框時調用該方法,finishingInput為true,onFinishInput方法會接著被調用.
onFinishInput()
往往在onFinishInputView之后調用,后續可能會接著調用onStartInput方法,或者處于閑置狀態,在使用輸入法過程中會頻繁的調用.
onUnbindInput()
與綁定的客戶端失去聯系時,會調用該方法.
onDestory()
輸入法服務結束時調用.只調用一次.再次方法中做好資源釋放的工作
三、關于輸入法界面
1.首先輸入法是否為全屏狀態,通常是非全屏狀態,會自動置底。因此要注意輸入法界面的高度,盡可能統一,否則會出現跳動的情況。(直接setVisibility在高度變低時,導致界面掉下來的效果,暫未找到解決方法,其他輸入法已解決)
2.界面可完全自定義,因為不是activity所以不能使用fragment,因此界面需要包含在一個layout中,建議使用include和MVP模式。
可以使用PopupWindow,但注意窗口的高度會被限制為輸入法的高度上限。
四、關于坑的記錄
1.回車鍵和搜索鍵的判斷
需要通過EditorInfo來獲取編輯框的信息,以imeOptions的值判斷是否為搜索框;
APP有幾種不同的值,但不同瀏覽器幾乎都不一致,所以需要測試匹配主流APP和瀏覽器。
不要使用KeyEvent.KEYCODE_ENTER,因為有的APP并沒有匹配搜索框的setOnKeyListener;
直接使用service的sendDefaultEditorAction(true)即可。
2.橫豎屏切換問題
橫豎屏切換會導致數據錯亂,在onConfigurationChanged可監聽到橫豎屏切換,將鍵盤關閉即可
3.關于刪除
1.長按刪除,監聽刪除按鈕的OnTouchListener,按下時連續刪除,彈起則結束
2.刪除文字:ic.deleteSurroundingText(1, 0) 但此方法不能刪除非字符內容,如QQ的引用回復。
因此應該是以KeyEvent.KEYCODE_DEL為準
4.后臺彈出應用權限獲取
AndroidQ(部分廠家更早版本也禁止了)之后系統已經禁止了后臺彈出應用,所以需要提示用戶手動開啟此功能。
總結
以上是生活随笔為你收集整理的android 输入法 确定按钮,Android 输入法笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2-2 学生成绩链表处理 (20 分)
- 下一篇: android sina oauth2.