Android 軟鍵盤響應事件解析

2021-09-11 10:16:19 字數 2050 閱讀 4600

最近重新設計了一遍專案中的搜尋欄,但是目前這個輸入框每次填完搜尋內容,都需要去按下右邊的搜尋按鈕,感覺比較麻煩。但是看到很多應用,填完內容後輸入框右下角按鈕直接會變成搜尋按鈕。平時對這方面了解比較少,故在此總結下android軟鍵盤響應事件。

要想實現這個小功能,就不得不說這個屬性,對應**中的方法是:

void setimeoptions(int imeoptions)int getimeoptions()

imeoptions常用的有以下幾種:

意思都很好理解 ,其中預設動作是actionunspecified,在**中這些值儲存在editorinfo類中,以ime開頭,如editorinfo.ime_action_go。所以上面我們需要實現的搜尋功能只是這些動作中的一種。另外還需要設定乙個屬性,不然無法生效:

android:singleline="true"

我的理解是,如果不設定限制單行,那麼右下角會被換行按鈕占用,這個功能是高於鍵盤動作事件優先順序的。 另外可能有些輸入法還要求設定:android:inputtype="text"

不過我實測不設定也可以(當然為了相容性還是建議設一下)。好了,這樣設完之後我們就可以在**中監聽這個動作的事件了:

medittext.setoneditoractionlistener(new edittext.oneditoractionlistener()  else 

return

true;

}return

false;

}});

複製**

看下效果:

返回true說明消耗了這個事件,不然會繼續執行這個動作預設的操作,這點在原始碼上很容易體現:

public void oneditoraction(int actioncode) 

}......執行預設動作

複製**

在原始碼中看出,系統實現的預設動作只有三個:

if (actioncode == editorinfo.ime_action_next) 

}return;

} else

if (actioncode == editorinfo.ime_action_previous)

}return;

} else

if (actioncode == editorinfo.ime_action_done)

return;}}

複製**

medittext.setoneditoractionlistener(new edittext.oneditoractionlistener()  else 

}return

false;

}});

複製**

上面提到必須要設定android:singleline="true",但是我們想換行怎麼辦? 在**中這樣設定就行了:

medittext.sethorizontallyscrolling(false);

medittext.setmaxlines(4);

複製**

在布局檔案中設定是無效的,應該也是優先順序的問題。加第一行**是因為edittextview內容超過一行是不會換行的而是左右滾動。

想自定義鍵盤上事件響應的按鈕是不行的,只能從已經設定好的幾個動作中選擇,由於第三方輸入法的不同,有些動作不會響應,顯示圖示也不盡相同。

我們是根據actionid而不是直接採用medittext.getimeoptions(),兩個值初始時是一樣的,但第一次軟體盤事件響應後,後者值就變了,而actionid還是原來的。軟鍵盤右下角按鈕的動作是取決於actionid的,這樣我們也就不需要在鍵盤消失後將medittext的動作還原。

android軟鍵盤事件處理

在android 開發中,經常會有乙個需求,做完某項操作後,隱藏鍵盤,也即讓 android 中的軟鍵盤不顯示。今天,和大家分享如何利用 來實現對 android 的軟體盤的隱藏 顯示的操作,並給出 demo 參考。這個效果是 如果有軟鍵盤,那麼隱藏它 反之,把它顯示出來。方法如下 1.得到inpu...

android遮蔽軟鍵盤

android name mainactivity android screenorientation landscape android windowsoftinputmode adjustpan statehidden android configchanges orientation keyb...

Android 軟鍵盤互動

方法很簡單,在edittext中設定兩個屬性 android imeoptions actionsearch android singleline true 這兩個屬性必須一起設定,不然不會生效。在沒有設定imeoptions屬性的情況下,設定了inputtype或者singleline true ...