android鍵盤開發
A. 【轉】Android軟鍵盤的全面解析
軟鍵盤其實是一個Dialog
InputMethodService為我們的輸入法創建了一個Dialog,並且對某些參數進行了設置,使之能夠在底部或者全屏顯示。當我們點擊輸入框時,系統會對當前的主窗口進行調整,以便留出相應的空間來顯示該Dialog在底部,或者全屏。
其實這段話我們經常在各種軟鍵盤博客所看到,但是大家並不知道Android是怎麼為我們創建的這個Dialog,所以我先帶大家來看下軟鍵盤生成這塊的源碼,了解軟鍵盤的生成流程。
我們先來看一下InputMethodService的繼承關系:
因為InputMethodService屬於服務,接下來我們先看一下服務的入口onCreate()方法:
通過上面的分析,我們懷疑這里的SoftInputWindow是軟鍵盤彈出創建的Dialog對象,下面我們看下SoftInputWindow的源碼。
看到這里大家就能明白了,為什麼說軟鍵盤就是一個Dialog。而且這里通過設置Gravity.BOTTOM來控制當前Dialog在Window中的位置。
在Android中,可以通過給Activity設置 windowSoftInputMode 這個屬性來控制軟鍵盤與Activity的主窗口的交互方式。
Activity 的主窗口與包含屏幕軟鍵盤的窗口的交互方式,該屬性的設置影響兩個方面:
該設置必須是下面所列的值之一,或者是一個「state…」值加上一個「adjust…」值的組合,在任一組中設置多個值(例如,多個「state…」值)都會產生未定義結果。各值之間使用垂直條 (|) 分隔。
下面將通過例子來介紹 adjustNoting 、 adjustUnspecified 、 adjustResize 、 adjustPan 在軟鍵盤彈出的區別:
非滾動布局xml
點擊最下面的EditText12
滾動布局xml
通過上面的例子,我們可以完全理解adjust系列的各個參數的作用。而軟鍵盤的顯示和隱藏這裡面需要並不多,而且內容並不算復雜,大家回去自己嘗試下就可以。
在日常開發中,如果需要將軟鍵盤的Enter鍵更改為其他鍵,可以設置其 android:imeOptions 屬性,這個屬性可以控制軟鍵盤的Enter鍵,以及橫屏情況下的軟鍵盤顯示狀態。
該設置必須是下面所列的值之一,或者是一個「action…」值加上一個「flag…」值的組合,在action…組中設置多個值(例如,多個「action…」值)都會產生未定義結果,而flag….可以設置多個。各值之間使用垂直條 (|) 分隔
控制軟鍵盤上的Enter鍵
橫屏下控制軟鍵盤
總結一下:
這里大部分的屬性,已經介紹完畢,如果英語好的同學,可以去看下官方文檔,可以更好的理解,並且本文以搜狗輸入法為實踐,可能其他的輸入法與其顯示的不同,但是功能應該都是一樣的。
而如果要在橫屏狀態不希望軟鍵盤全屏顯示最好是將flagNoFullscreen和flagNoExtractUi結合使用,這樣體驗上會更好
android:imeOptions=」flagNoFullscreen|flagNoExtractUi」
Android官網的Api
如果需要監聽軟鍵盤的右下角的按鍵,需要為EditText設置setOnEditorActionListener()監聽:
上面的方式,只是展示了如何監聽各個按鍵的方法,如果需要消費事件,則需要return true。
(1)第一次寫這么長的博客,感覺會有一些不足,各位看官如果有不合理的地方,或者有誤的地方請直接指出。
(2)本來想整理成一個Demo的,後來簡單看來下,該有的幾乎都貼出來了,有需要的可以按需復制就可以。
(3)寫完這篇博客之後,感覺博客干貨還是不多,所以定位這篇文章算是總結性質加上實際案例性質的博客。
(4)Android軟鍵盤的總結就差不多到這里,希望各位看官,如果看到這里有收獲,就點點贊,灌灌水,頂一波,這樣博主才有寫下去的動力。
(5)感謝小輝同學的校驗,調整了文章中不通順的地方。
1.徹底搞定Android開發中軟鍵盤的常見問題
http://blog.csdn.net/mynameishuangshuai/article/details/51567357
2.Android UI(EditText)詳解
http://blog.csdn.net/qq_28057577/article/details/51919965?locationNum=12&fps=1
3.微信軟鍵盤布局閃動問題
https://blog.dreamtobe.cn/2015/09/01/keyboard-panel-switch/
B. 請問以前你提的問題:android開發:軟鍵盤顯示的時候把布局往上頂。是怎麼解決的是布局問題嗎
在主xml中android:windowSoftInputMode的屬性
"stateUnspecified"
軟鍵盤的狀態(是否它是隱藏或可見)沒有被指定。系統將選擇一個合適的狀態或依賴於主題的設置。
這個是為了軟體盤行為默認的設置。
"stateUnchanged"
軟鍵盤被保持無論它上次是什麼狀態,是否可見或隱藏,當主窗口出現在前面時。
"stateHidden"
當用戶選擇該Activity時,軟鍵盤被隱藏——也就是,當用戶確定導航到該Activity時,而不是返回到它由於離開另一個Activity。
"stateAlwaysHidden"
軟鍵盤總是被隱藏的,當該Activity主窗口獲取焦點時。
"stateVisible"
軟鍵盤是可見的,當那個是正常合適的時(當用戶導航到Activity主窗口時)。
"stateAlwaysVisible"
當用戶選擇這個Activity時,軟鍵盤是可見的——也就是,也就是,當用戶確定導航到該Activity時,而不是返回到它由於離開另一個Activity。
"adjustUnspecified"
它不被指定是否該Activity主窗口調整大小以便留出軟鍵盤的空間,或是否窗口上的內容得到屏幕上當前的焦點是可見的。系統將自動選擇這些模式中一種主要依賴於是否窗口的內容有任何布局視圖能夠滾動他們的內容。如果有這樣的一個視圖,這個窗口將調整大小,這樣的假設可以使滾動窗口的內容在一個較小的區域中可見的。這個是主窗口默認的行為設置。
"adjustResize"
該Activity主窗口總是被調整屏幕的大小以便留出軟鍵盤的空間
"adjustPan"
該Activity主窗口並不調整屏幕的大小以便留出軟鍵盤的空間。相反,當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內容的部分。這個通常是不期望比調整大小,因為用戶可能關閉軟鍵盤以便獲得與被覆蓋內容的交互操作。
C. android開發中,EditText點擊事件可以響應,就是不彈出軟鍵盤。怎麼解決,EditText是在Dialog中使用的
當點擊EditText時:
1、存儲當前的輸入類型
2、設置輸入類型為InputType.TYPE_NULL,禁止手機軟鍵盤
3、還原原來的輸入類型,因為這次操作完,還要允許用戶修改。
4、彈出日期選擇對話框,操作完後將結果顯示到EditText上。
隱藏軟體盤,代碼如下:
EditText et_start_time = (EditText) this.findViewById(R.id.et_start_time);
int inType = et_start_time.getInputType();
et_start_time.setInputType(InputType.TYPE_NULL);
et_start_time.onTouchEvent(event);
et_start_time.setInputType(inType);
et_start_time.setSelection(et_start_time.getText().length());
D. 如何實現android EditText允許輸入字母和數字,同時默認彈出數字鍵盤
這個問題看似簡單,不過由於Android輸入法的開放性,許多輸入法相關的參數設置是由第三方輸入法來實現的,而第三方輸入法眾多、實現不一,導致這個問題變得很復雜。
結論是,目前來看,並沒有直接的方法,可以對所有輸入法實現上述需求。
不過針對這個問題,我們有以下幾種處理方案:
設置android:digits屬性,允許輸入數字和字母。
設置android:inputType為"number",將鍵盤切換為數字鍵盤。
這里的關鍵是,雖然單獨設置android:inputType="number"時,只允許輸入數字;但同時設置android:inputType和android:digits時,允許輸入的字元是以android:digits為準的。
當輸入法本身的UI允許在數字鍵盤、字母鍵盤間切換時,該方案是有效的;但是一些輸入法的數字鍵盤不能切換到字母鍵盤,該方案失效;特別是,Android5.0的原生輸入法就是如此,數字鍵盤UI沒有提供切換到其他鍵盤的按鈕。
雖然該方案對一些輸入法(尤其是英文輸入法)無效,但是中文輸入法基本都是有效的。如果APP僅在國內用的,這個方案夠用了
方案一失效的主要原因是,輸入法界面中沒有提供切換鍵盤的按鍵,所以我們可以自己添上按鍵。
帶來的問題是,自己添加按鍵,很難與輸入法保持統一的UI風格;而當輸入法本身有鍵盤切換按鍵時,這個方案是畫蛇添足,既怪異又不美觀。 所以這個方案在UI上有嚴重缺陷,並不實用。
效果圖如下:
Activity如下:
activity_main.xml如下:
自定義鍵盤可以徹底解決問題,是最完美的方案;但是復雜度有點高。
默認彈出數字鍵盤真的有那麼重要麼?沒有的話,乾脆不要折騰了,StackOverflow上那麼多人已經證明這個問題無完美解了。