軟鍵盤其實是一個Dialog
創(chuàng)新互聯(lián)公司于2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站建設(shè)、成都做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元景東做網(wǎng)站,已為上家服務(wù),為景東各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575
InputMethodService為我們的輸入法創(chuàng)建了一個Dialog,并且對某些參數(shù)進行了設(shè)置,使之能夠在底部或者全屏顯示。當我們點擊輸入框時,系統(tǒng)會對當前的主窗口進行調(diào)整,以便留出相應(yīng)的空間來顯示該Dialog在底部,或者全屏。
其實這段話我們經(jīng)常在各種軟鍵盤博客所看到,但是大家并不知道Android是怎么為我們創(chuàng)建的這個Dialog,所以我先帶大家來看下軟鍵盤生成這塊的源碼,了解軟鍵盤的生成流程。
我們先來看一下InputMethodService的繼承關(guān)系:
因為InputMethodService屬于服務(wù),接下來我們先看一下服務(wù)的入口onCreate()方法:
通過上面的分析,我們懷疑這里的SoftInputWindow是軟鍵盤彈出創(chuàng)建的Dialog對象,下面我們看下SoftInputWindow的源碼。
看到這里大家就能明白了,為什么說軟鍵盤就是一個Dialog。而且這里通過設(shè)置Gravity.BOTTOM來控制當前Dialog在Window中的位置。
在Android中,可以通過給Activity設(shè)置 windowSoftInputMode 這個屬性來控制軟鍵盤與Activity的主窗口的交互方式。
Activity 的主窗口與包含屏幕軟鍵盤的窗口的交互方式,該屬性的設(shè)置影響兩個方面:
該設(shè)置必須是下面所列的值之一,或者是一個“state…”值加上一個“adjust…”值的組合,在任一組中設(shè)置多個值(例如,多個“state…”值)都會產(chǎn)生未定義結(jié)果。各值之間使用垂直條 (|) 分隔。
下面將通過例子來介紹 adjustNoting 、 adjustUnspecified 、 adjustResize 、 adjustPan 在軟鍵盤彈出的區(qū)別:
非滾動布局xml
點擊最下面的EditText12
滾動布局xml
通過上面的例子,我們可以完全理解adjust系列的各個參數(shù)的作用。而軟鍵盤的顯示和隱藏這里面需要并不多,而且內(nèi)容并不算復(fù)雜,大家回去自己嘗試下就可以。
在日常開發(fā)中,如果需要將軟鍵盤的Enter鍵更改為其他鍵,可以設(shè)置其 android:imeOptions 屬性,這個屬性可以控制軟鍵盤的Enter鍵,以及橫屏情況下的軟鍵盤顯示狀態(tài)。
該設(shè)置必須是下面所列的值之一,或者是一個“action…”值加上一個“flag…”值的組合,在action…組中設(shè)置多個值(例如,多個“action…”值)都會產(chǎn)生未定義結(jié)果,而flag….可以設(shè)置多個。各值之間使用垂直條 (|) 分隔
控制軟鍵盤上的Enter鍵
橫屏下控制軟鍵盤
總結(jié)一下:
這里大部分的屬性,已經(jīng)介紹完畢,如果英語好的同學(xué),可以去看下官方文檔,可以更好的理解,并且本文以搜狗輸入法為實踐,可能其他的輸入法與其顯示的不同,但是功能應(yīng)該都是一樣的。
而如果要在橫屏狀態(tài)不希望軟鍵盤全屏顯示最好是將flagNoFullscreen和flagNoExtractUi結(jié)合使用,這樣體驗上會更好
android:imeOptions=”flagNoFullscreen|flagNoExtractUi”
Android官網(wǎng)的Api
如果需要監(jiān)聽軟鍵盤的右下角的按鍵,需要為EditText設(shè)置setOnEditorActionListener()監(jiān)聽:
上面的方式,只是展示了如何監(jiān)聽各個按鍵的方法,如果需要消費事件,則需要return true。
(1)第一次寫這么長的博客,感覺會有一些不足,各位看官如果有不合理的地方,或者有誤的地方請直接指出。
(2)本來想整理成一個Demo的,后來簡單看來下,該有的幾乎都貼出來了,有需要的可以按需復(fù)制就可以。
(3)寫完這篇博客之后,感覺博客干貨還是不多,所以定位這篇文章算是總結(jié)性質(zhì)加上實際案例性質(zhì)的博客。
(4)Android軟鍵盤的總結(jié)就差不多到這里,希望各位看官,如果看到這里有收獲,就點點贊,灌灌水,頂一波,這樣博主才有寫下去的動力。
(5)感謝小輝同學(xué)的校驗,調(diào)整了文章中不通順的地方。
1.徹底搞定Android開發(fā)中軟鍵盤的常見問題
2.Android UI(EditText)詳解
;fps=1
3.微信軟鍵盤布局閃動問題
原文鏈接:徹底搞定Android開發(fā)中軟鍵盤的常見問題
軟件盤的本質(zhì)是什么?軟鍵盤其實是一個Dialog。
InputMethodService為我們的輸入法創(chuàng)建了一個Dialog,并且將該Dialog的Window的某些參數(shù)(如Gravity)進行了設(shè)置,使之能夠在底部或者全屏顯示。當我們點擊輸入框時,系統(tǒng)對活動主窗口進行調(diào)整,從而為輸入法騰出相應(yīng)的空間,然后將該Dialog顯示在底部,或者全屏顯示。
軟鍵盤顯示的調(diào)整
Android 定義了一個屬性,名字為windowSoftInputMode, 這個屬性用于設(shè)置Activity主窗口與軟鍵盤的交互模式,用于避免軟鍵盤遮擋內(nèi)容的問題。我們可以在AndroidManifet.xml中對Activity進行設(shè)置。如:android:windowSoftInputMode=”stateUnchanged|adjustPan”。 該屬性可選的值有兩部分,一部分為軟鍵盤的狀態(tài)控制,控制軟鍵盤是隱藏還是顯示,另一部分是Activity窗口的調(diào)整,以便騰出空間展示軟鍵盤。 android:windowSoftInputMode的屬性設(shè)置必須是下面中的一個值,或一個”state”值加一個”adjust”值的組合,各個值之間用 | 分開。
stateUnspecified-未指定狀態(tài) :當我們沒有設(shè)置android:windowSoftInputMode屬性的時候,軟件默認采用的就是這種交互方式,系統(tǒng)會根據(jù)界面采取相應(yīng)的軟鍵盤的顯示模式。
stateUnchanged-不改變狀態(tài) :當前界面的軟鍵盤狀態(tài),取決于上一個界面的軟鍵盤狀態(tài),無論是隱藏還是顯示。
stateHidden-隱藏狀態(tài) :當設(shè)置該狀態(tài)時,軟鍵盤總是被隱藏,不管是否有輸入的需求。
stateAlwaysHidden-總是隱藏狀態(tài) :當設(shè)置該狀態(tài)時,軟鍵盤總是被隱藏,和stateHidden不同的是,當我們跳轉(zhuǎn)到下個界面,如果下個頁面的軟鍵盤是顯示的,而我們再次回來的時候,軟鍵盤就會隱藏起來。
stateVisible-可見狀態(tài) :當設(shè)置為這個狀態(tài)時,軟鍵盤總是可見的,即使在界面上沒有輸入框的情況下也可以強制彈出來出來。
stateAlwaysVisible-總是顯示狀態(tài) :當設(shè)置為這個狀態(tài)時,軟鍵盤總是可見的,和stateVisible不同的是,當我們跳轉(zhuǎn)到下個界面,如果下個頁面軟鍵盤是隱藏的,而我們再次回來的時候,軟鍵盤就會顯示出來。
adjustUnspecified-未指定模式 :設(shè)置軟鍵盤與軟件的顯示內(nèi)容之間的顯示關(guān)系。當你跟我們沒有設(shè)置這個值的時候,這個選項也是默認的設(shè)置模式。在這中情況下,系統(tǒng)會根據(jù)界面選擇不同的模式。
adjustResize-調(diào)整模式 :該模式下窗口總是調(diào)整屏幕的大小用以保證軟鍵盤的顯示空間;這個選項不能和adjustPan同時使用,如果這兩個屬性都沒有被設(shè)置, 系統(tǒng)會根據(jù)窗口中的布局自動選擇其中一個 。
adjustPan-默認模式 :該模式下通過不會調(diào)整來保證軟鍵盤的空間,而是采取了另外一種策略,系統(tǒng)會通過布局的移動,來保證用戶要進行輸入的輸入框肯定在用戶的視野范圍里面,從而讓用戶可以看到自己輸入的內(nèi)容。
案例
沒有滾動布局xml
對于沒有滾動控件的布局來說,adjustPan就是默認的設(shè)置,比如我們案例應(yīng)用中的文本輸入8,上面的文本輸入框123和按鈕都會被頂上去,且頁面布局不可以滾動。
對于沒有滾動控件的布局來說,整個布局會網(wǎng)上偏移(包括標題等)以保證輸入框的可見。如果有滾動控件,那么就是內(nèi)容網(wǎng)上偏移,標題不會動,還可以通關(guān)滾動來查看被頂上去的內(nèi)容,而這點是不可滾動的布局所不具備的
有滾動布局xml
對于有滾動控件的布局,則是采用的adjustResize方式,比如我們案例應(yīng)用中的文本輸入8,上面的文本輸入框123和按鈕都會被頂上去, 可以通過滾動來查看被頂上去的內(nèi)容。
** 根據(jù)這一原理,我們就可以把開發(fā)中遇到的軟鍵盤遮擋頁面的問題,利用ScrollView當做根布局,讓系統(tǒng)采用adjustResize模式,很好地解決這一問題。**
自動彈出軟鍵盤
有時候需要一進入Activity后就自動彈出軟鍵盤,可以通過設(shè)置一個時間函數(shù)來實現(xiàn),具體寫法如下:
方法一:
方法二:
有時進入Activity后不希望系統(tǒng)自動彈出軟鍵盤,我們可以按照下面的方法來實現(xiàn):
方法一:
在AndroidMainfest.xml中選擇那個activity,設(shè)置windowSoftInputMode屬性為adjustUnspecified|stateHidden
方法二:
讓EditText失去焦點,使用EditText的clearFocus方法
方法三:
強制隱藏Android輸入法窗口
方法四:
EditText始終不彈出軟件鍵盤
EditText設(shè)置ScrollView壓縮背景圖片解決辦法
在你的Activity里加上
有時希望根據(jù)條件動態(tài)關(guān)閉軟鍵盤,我們可以使用InputMethodManager類,按照下面的方法來實現(xiàn):
方法一:
方法二:
強制隱藏軟鍵盤,這個方法倒是很實用。
方法三:
方法四:
在onclick事件下.以下方法可行.(如果是EditText失去焦點/得到焦點,沒有效果)
InputMethodManager的具體用法可以參考下面的鏈接:
使用android:imeOptinos可對Android自帶的軟鍵盤進行一些界面上的設(shè)置:
android:imeOptions="flagNoExtractUi" //使軟鍵盤不全屏顯示,只占用一部分屏幕
同時,這個屬性還能控件軟鍵盤右下角按鍵的顯示內(nèi)容,默認情況下為回車鍵
android:imeOptions="actionNone" //輸入框右側(cè)不帶任何提示 android:imeOptions="actionGo" //右下角按鍵內(nèi)容為'開始' android:imeOptions="actionSearch" //右下角按鍵為放大鏡圖片,搜索 android:imeOptions="actionSend" //右下角按鍵內(nèi)容為'發(fā)送' android:imeOptions="actionNext" //右下角按鍵內(nèi)容為'下一步' android:imeOptions="actionDone" //右下角按鍵內(nèi)容為'完成'
同時,可能EditText添加相應(yīng)的監(jiān)聽器,捕捉用戶點擊了軟鍵盤右下角按鈕的監(jiān)聽事件,以便進行處理。
開發(fā)中有個需求是將頁面底部的一個按鈕頂起,但是開發(fā)時發(fā)現(xiàn)Android5.0以后的版本設(shè)置了adjustResize屬性后無法成功頂起。糾結(jié)了好久,最后在stackoverflow找到解決方案,那就是在根布局上加上fitsSystemWindow=”true”即可。
這里的fitsSystemWindow具體的作用就是你的**contentview是否忽略actionbar,title,屏幕的底部虛擬按鍵,將整個屏幕當作可用的空間。 **
正常情況,contentview可用的空間是去除了actionbar,title,底部按鍵的空間后剩余的可用區(qū)域;這個屬性設(shè)置為true,則忽略,false則不忽略
在edittext上加入Android:imeOptions=”actionSearch”這個屬性沒響應(yīng),最后發(fā)現(xiàn)在2.3及以上版本不起作用,解決方案:加上
因為輸入法鍵盤右下角默認的回車鍵本來就是換行用的,當設(shè)置單行后,回車換行就失去作用了,這樣就可以設(shè)置為搜索、發(fā)送、go等等。
原因是因為當界面初始化的時候可能EditText并沒有初始化完成,就要求顯示軟鍵盤了。
在包含EditText外層布局上添加,搶在EditText獲取焦點,即可。
正常情況下,只要寫了EditText控件,當進入Activity時,是會直接顯示軟鍵盤的,但是如果我們的EditText是GONE或者INVISIBLE的話,當我們點擊其他控件,然后讓Edittext顯示,并且彈出軟鍵盤,那么這個時候就必須關(guān)注順序的問題,必須必須先讓EditText顯示,在調(diào)用顯示軟鍵盤的代碼才可以,如果先讓軟鍵盤彈出再讓EditText顯示,這個時候軟鍵盤是彈不出來的。
可以通過下面的代碼來實現(xiàn)Android自動彈出軟鍵盤:
edittext.requestFocus(); //edittext是一個EditText控件
Timer timer = new Timer(); //設(shè)置定時器
timer.schedule(new TimerTask() {
@Override
public void run() { //彈出軟鍵盤的代碼
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(edittext, InputMethodManager.RESULT_SHOWN);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);
}
}, 300); //設(shè)置300毫秒的時長
說明:同樣是在寫Techo Lite時遇到的問題。希望程序可以自動彈出軟鍵盤,可是嘗試了各種辦法都沒有效果。問題的原因似乎是必須等待UI繪制完成后彈出軟鍵盤的代碼才會有效。于是就采用了上面的方法。需要注意的是,在此之前必須讓edittext獲取焦點,不然也是無效的。
1、首先,在xml文件中通過讓edittext獲取焦點
EditText
? ? android:layout_width="match_parent"
? ? android:layout_height="match_parent"
? ? android:padding="17dp"
? ? android:textColor="#333333"
? ? android:textColorHint="#999999"
? ? android:hint="請輸入課件描述..."
? ? android:gravity="top|left"
? ? android:background="@null"
? ?
? ? requestFocus/
/EditText
2、在清單文件中給activity添加android:windowSoftInputMode=”stateVisible”屬性,這樣一進入這個頁面的時候光標就自動顯示,軟鍵盤也顯示出來
activity
? ? ? ? android:name=".wonderfulmoment.AddCourseWareDescriptionActivity"
? ? ? ? android:windowSoftInputMode="stateVisible"/activity