天天看點

android 鍵盤按鍵監聽

onKeyDown方法:該方法是接口KeyEvent.Callback中的抽象方法,所有的View全部實作了該接口并重寫了該方法,該方法用來捕捉手機鍵盤被按下的事件。

public boolean onKeyDown (int keyCode, KeyEvent event)

參數keyCode,該參數為被按下的鍵值即鍵盤碼,手機鍵盤中每個按鈕都會有其單獨的鍵盤碼,在應用程式都是通過鍵盤碼才知道使用者按下的是哪個鍵。

參數event,該參數為按鍵事件的對象,其中包含了觸發事件的詳細資訊,例如事件的狀态、事件的類型、事件發生的時間等。當使用者按下按鍵時,系統會自動将事件封裝成KeyEvent對象供應用程式使用。

 傳回值,該方法的傳回值為一個boolean類型的變量,當傳回true時,表示已經完整地處理了這個事件,并不希望其他的回調方法再次進行處理,而當返 回false時,表示并沒有完全處理完該事件,更希望其他回調方法繼續對其進行處理,例如Activity中的回調方法。

前言:

我們在android手機上面有時候會遇到監聽手機軟鍵盤按鍵的時候,例如:我們在浏覽器輸入url完畢後可以點選軟鍵盤右下角的“GO”按鍵加載url頁面;在點選搜尋框的時候,點選右下角的search符号鍵可以進行搜尋;或者在全部資料輸入完畢後,點選右下角的"done"就馬上進行下一步操作。

效果圖:

android 鍵盤按鍵監聽
android 鍵盤按鍵監聽

function 1:

重寫Activity的dispatchKeyEvent(KeyEvent event)方法,在其中監聽KeyEventKey.KEYCODE_ENTER鍵(右下角确定鍵),當此鍵按下的時候,隐藏輸入法軟鍵盤,設定edittext内容和加載webview内容。

​​​​​ ​​​​

1. @Override
2. public boolean dispatchKeyEvent(KeyEvent event) {
3. if(event.getKeyCode() == KeyEvent.KEYCODE_ENTER){
4. /*隐藏軟鍵盤*/
5. InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
6. if(inputMethodManager.isActive()){
7. this.getCurrentFocus().getWindowToken(), 0);
8. }
9. 
10. "success");
11. webview.loadUrl(URL);
12. return true;
13. }
14. return super.dispatchKeyEvent(event);
15. }      

function 2:

重寫dispatchKeyEvent(KeyEvent event)的方法感覺有點用牛刀的感覺,因為我們非常可能在這個方法中進行其他任務,是以我們可以使用OnKeyListener的方法來監聽軟鍵盤按鍵。

1. private OnKeyListener onKeyListener = new OnKeyListener() {
2. 
3. @Override
4. public boolean onKey(View v, int keyCode, KeyEvent event) {
5. if(keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN){
6. /*隐藏軟鍵盤*/
7. InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
8. if(inputMethodManager.isActive()){
9. 0);
10. }
11. "success");
12. webview.loadUrl(URL);
13. return true;
14. }
15. return false;
16. }
17. };
  
        
    

1. edittext.setOnKeyListener(onKeyListener);      

function 3:

第三種方法我認為可以幫助程式員更精确的判斷右下角按鍵情況,以便應對更加複雜的情況。它可以幫助程式員依據目前情況下為“GO”,“done”,“search”鍵的情況下做出更細分的操作。

1. edittext.setOnEditorActionListener(new TextView.OnEditorActionListener() {
2. @Override
3. public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
4. /*判斷是否是“GO”鍵*/
5. if(actionId == EditorInfo.IME_ACTION_GO){
6. /*隐藏軟鍵盤*/
7. InputMethodManager imm = (InputMethodManager) v
8. .getContext().getSystemService(
9. Context.INPUT_METHOD_SERVICE);
10. if (imm.isActive()) {
11. imm.hideSoftInputFromWindow(
12. 0);
13. }
14. 
15. "success");
16. webview.loadUrl(URL);
17. 
18. return true;
19. }
20. return false;
21. }
22. });      

改變軟鍵盤右下角确定鍵樣式:

軟鍵盤輸入法的按鍵并不是一成不變的,例如它的右下角的“确定”鍵,在有搜尋框的時候就會變成帶搜尋圖示的按鍵,在浏覽器位址欄的時候則會變成“GO”鍵,我們在寫App的時候也可能根據情況的不同設定輸入法的“确定”鍵,改變方法就是給EditText控件的imeOptions屬性設定成不同的值(此時Enter鍵可以顯示不同的文字和圖案)。

1. <EditText
2. android:id="@+id/edittext"
3. android:layout_width="match_parent"
4. android:layout_height="wrap_content"
5. android:singleLine="true"
6. android:imeOptions="actionSearch"/>      

actionNone : Enter鍵,按下後光标到下一行

actionGo : Go,

actionSearch : 放大鏡

actionSend : Send

actionNext : Next

actionDone : Done,确定/完成,隐藏軟鍵盤,即使不是最後一個文本輸入框

題外話:

 我在寫這個demo的時候,發現了webview的一個問題,就是直接使用webview.load(url)方法會在手機上面彈出系統浏覽器來通路url連結,而不是我們設定的webview,我找到的解決辦法就是使用webview.setWebViewClient(....)的方法來確定url會在activity的webview上面加載。