Android中的windowSoftInputMode屬性詳解
在前面的一篇文章中,簡(jiǎn)單的介紹了一下如何實(shí)現(xiàn)軟鍵盤(pán)不自動(dòng)彈出,使用的方法是設(shè)置android:windowSoftInputMode屬性。那么,這個(gè)屬性到底是干什么的,他有什么作用呢?今天這篇文章,就是探索android:windowSoftInputMode屬性的作用的。
首先,我們從這個(gè)屬性的名稱中,可以很直觀的看出它的作用,這個(gè)屬性就是來(lái)設(shè)置窗口軟鍵盤(pán)的交互模式的。
android:windowSoftInputMode屬性一共有9個(gè)取值,分別是:
stateUnspecified,stateUnchanged,stateHidden,stateAlwaysHidden,stateVisible,stateAlwaysVisible,adjustUnspecified,adjustResize,adjustPan。
我們?cè)O(shè)置屬性的時(shí)候,可以在這9個(gè)值里面選擇一個(gè),也可以用"state...|adjust"的形式進(jìn)行設(shè)置。那么,這些取值到底是怎么影響到軟鍵盤(pán)與窗口之間的交互的呢?下面,我們就一個(gè)個(gè)的測(cè)試這9個(gè)取值,到底是如何影響軟鍵盤(pán)的顯示的。
1.stateUnspecified
中文意思是未指定狀態(tài),當(dāng)我們沒(méi)有設(shè)置android:windowSoftInputMode屬性的時(shí)候,軟件默認(rèn)采用的就是這種交互方式,系統(tǒng)會(huì)根據(jù)界面采取相應(yīng)的軟鍵盤(pán)的顯示模式,比如,當(dāng)界面上只有文本和按鈕的時(shí)候,軟鍵盤(pán)就不會(huì)自動(dòng)彈出,因?yàn)闆](méi)有輸入的必要。那么,當(dāng)界面上出現(xiàn)了獲取了焦點(diǎn)的輸入框的時(shí)候,軟鍵盤(pán)會(huì)不會(huì)自動(dòng)的彈出呢?這個(gè)還真不一定!比如,在下面的這個(gè)界面布局中,軟鍵盤(pán)并不會(huì)自動(dòng)彈出。
就是說(shuō),默認(rèn)的,在這種界面情況下,系統(tǒng)并不確定用戶是否需要軟鍵盤(pán),因此不會(huì)自動(dòng)彈出。但是,為什么說(shuō)不一定呢?這是因?yàn)?,如果我們?cè)谶@個(gè)布局的外面,包裹上一個(gè)
ScrollView,軟鍵盤(pán)就會(huì)自動(dòng)的彈出來(lái)了!
如下,在這種布局文件下,軟鍵盤(pán)會(huì)自動(dòng)的彈出
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="toOther"
android:text="跳轉(zhuǎn)" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>
</LinearLayout>
這確實(shí)是一個(gè)很奇怪的判斷方式。因此,我們可以得出結(jié)論,當(dāng)設(shè)置屬性為stateUnspecified的時(shí)候,系統(tǒng)是默認(rèn)不彈出軟鍵盤(pán)的,但是當(dāng)有獲得焦點(diǎn)的輸入框的界面有滾動(dòng)的需求的時(shí)候,會(huì)自動(dòng)彈出軟鍵盤(pán)。至于為什么非要強(qiáng)調(diào)要獲取焦點(diǎn)的輸入框,這是因?yàn)椋绻皇禽斎肟颢@取焦點(diǎn),軟鍵盤(pán)也是不會(huì)自動(dòng)彈出的,讓界面不自動(dòng)彈出軟鍵盤(pán)的其中一個(gè)解決方案,就是在xml文件中,設(shè)置一個(gè)非輸入框控件獲取焦點(diǎn),從而阻止鍵盤(pán)彈出。
2.stateUnchanged
中文的意思就是狀態(tài)不改變的意思,我們應(yīng)該怎么理解這句話呢?其實(shí)很好理解,就是說(shuō),當(dāng)前界面的軟鍵盤(pán)狀態(tài),取決于上一個(gè)界面的軟鍵盤(pán)狀態(tài)。舉個(gè)例子,假如當(dāng)前界面鍵盤(pán)是隱藏的,那么跳轉(zhuǎn)之后的界面,軟鍵盤(pán)也是隱藏的;如果當(dāng)前界面是顯示的,那么跳轉(zhuǎn)之后的界面,軟鍵盤(pán)也是顯示狀態(tài)。
3.stateHidden
顧名思義,如果我們?cè)O(shè)置了這個(gè)屬性,那么鍵盤(pán)狀態(tài)一定是隱藏的,不管上個(gè)界面什么狀態(tài),也不管當(dāng)前界面有沒(méi)有輸入的需求,反正就是不顯示。因此,我們可以設(shè)置這個(gè)屬性,來(lái)控制軟鍵盤(pán)不自動(dòng)的彈出。
4.stateAlwaysHidden
這個(gè)屬性也可以讓軟鍵盤(pán)隱藏,但是我暫時(shí)還不知道和stateHidden屬性的區(qū)別,本來(lái)想去stackOverFlow上問(wèn)一下的,但是,Great Wall,呵呵呵...祝愿病魔早日戰(zhàn)勝方校長(zhǎng)
5.stateVisible
設(shè)置為這個(gè)屬性,可以將軟鍵盤(pán)召喚出來(lái),即使在界面上沒(méi)有輸入框的情況下也可以強(qiáng)制召喚出來(lái)。
6.stateAlwaysVisible
這個(gè)屬性也是可以將鍵盤(pán)召喚出來(lái),但是與stateVisible屬性有小小的不同之處。舉個(gè)例子,當(dāng)我們?cè)O(shè)置為stateVisible屬性,如果當(dāng)前的界面鍵盤(pán)是顯示的,當(dāng)我們點(diǎn)擊按鈕跳轉(zhuǎn)到下個(gè)界面的時(shí)候,軟鍵盤(pán)會(huì)因?yàn)檩斎肟蚴ソ裹c(diǎn)而隱藏起來(lái),當(dāng)我們?cè)俅位氐疆?dāng)前界面的時(shí)候,鍵盤(pán)這個(gè)時(shí)候是隱藏的。但是如果我們?cè)O(shè)置為stateAlwaysVisible,我們跳轉(zhuǎn)到下個(gè)界面,軟鍵盤(pán)還是隱藏的,但是當(dāng)我們?cè)俅位貋?lái)的時(shí)候,軟鍵盤(pán)是會(huì)顯示出來(lái)的。所以,這個(gè)Always就解釋了這個(gè)區(qū)別,不管什么情況到達(dá)當(dāng)前界面(正常跳轉(zhuǎn)或者是上一個(gè)界面被用戶返回),軟鍵盤(pán)都是顯示狀態(tài)。
說(shuō)到這里,我聯(lián)想到了上面的stateHidden和stateAlwaysHidden,我估計(jì)區(qū)別也是這樣的,就是說(shuō),stateAlwaysHidden無(wú)論如何都是隱藏的,但是如果在跳轉(zhuǎn)到下個(gè)界面的時(shí)候,軟鍵盤(pán)被召喚出來(lái)了,那么當(dāng)下個(gè)界面被用戶返回的時(shí)候,鍵盤(pán)應(yīng)該是不會(huì)被隱藏的,但是,我還沒(méi)有找到能夠跳轉(zhuǎn)到下個(gè)界面,還讓當(dāng)前界面軟鍵盤(pán)不消失的方法,所以暫時(shí)不能驗(yàn)證。
7.adjustUnspecified
從這個(gè)屬性開(kāi)始,就不是設(shè)置軟鍵盤(pán)的顯示與隱藏模式了,而是設(shè)置軟鍵盤(pán)與軟件的顯示內(nèi)容之間的顯示關(guān)系。當(dāng)你跟我們沒(méi)有設(shè)置這個(gè)值的時(shí)候,這個(gè)選項(xiàng)也是默認(rèn)的設(shè)置模式。在這中情況下,系統(tǒng)會(huì)根據(jù)界面選擇不同的模式。如果界面里面有可以滾動(dòng)的控件,比如ScrowView,系統(tǒng)會(huì)減小可以滾動(dòng)的界面的大小,從而保證即使軟鍵盤(pán)顯示出來(lái)了,也能夠看到所有的內(nèi)容。如果布局里面沒(méi)有滾動(dòng)的控件,那么軟鍵盤(pán)可能就會(huì)蓋住一些內(nèi)容,我們從下面的圖中可以看出差別。
沒(méi)有滾動(dòng)控件,軟鍵盤(pán)下面的布局都被遮擋住了,若想修改,只能隱藏軟鍵盤(pán),然后選擇。而且,重點(diǎn)注意一下上面的布局,當(dāng)我們選擇的輸入框偏下的時(shí)候,上面的標(biāo)題欄和布局被軟鍵盤(pán)頂上去了。記住這個(gè)特征,因?yàn)楹竺嬗袀€(gè)屬性和這個(gè)的效果不一樣。
布局里面有滑動(dòng)控件,系統(tǒng)會(huì)自動(dòng)的縮小整個(gè)界面的大小,因此,我們可以軟鍵盤(pán)上面的小區(qū)域中顯示所有的輸入框。
這就是兩中顯示模式之間的差別。
8.adjustResize
這個(gè)屬性表示Activity的主窗口總是會(huì)被調(diào)整大小,從而保證軟鍵盤(pán)顯示空間。
我們先看顯示效果。
注意觀察這個(gè)上面的標(biāo)題欄和按鈕,設(shè)置為adjustResize屬性之后,對(duì)于沒(méi)有滑動(dòng)控件的布局,雖然還是不能選擇所有的輸入框,但是,窗口的顯示方式發(fā)生了變化,默認(rèn)屬性時(shí),整個(gè)布局是被頂上去了,但是設(shè)置為adjustResize屬性,布局的位置并沒(méi)有發(fā)生什么變化,這就是最大的區(qū)別。
而對(duì)于有滑動(dòng)控件的布局來(lái)說(shuō),顯示效果和默認(rèn)是一樣的。
9.adjustPan
如果設(shè)置為這個(gè)屬性,那么Activity的屏幕大小并不會(huì)調(diào)整來(lái)保證軟鍵盤(pán)的空間,而是采取了另外一種策略,系統(tǒng)會(huì)通過(guò)布局的移動(dòng),來(lái)保證用戶要進(jìn)行輸入的輸入框肯定在用戶的失業(yè)范圍里面,從而讓用戶可以看到自己輸入的內(nèi)容。對(duì)于沒(méi)有滾動(dòng)控件的布局來(lái)說(shuō),這個(gè)其實(shí)就是默認(rèn)的設(shè)置,如果我們選擇的位置偏下,上面的標(biāo)題欄和部分控件會(huì)被頂上去。但是對(duì)于有滾動(dòng)控件的布局來(lái)說(shuō),則不太一樣,我們看下面的效果圖。
首先,這是軟鍵盤(pán)沒(méi)有彈出的時(shí)候,有滾動(dòng)控件的顯示范圍,最下面顯示的是9.
當(dāng)我們點(diǎn)擊5這個(gè)輸入框,我們會(huì)發(fā)現(xiàn)下面的現(xiàn)象。
最上面只能夠顯示到按鈕,標(biāo)題欄已經(jīng)不能看到了。
而最下面也只能滑動(dòng)到8,下面的內(nèi)容也不能夠滑動(dòng)了。
因此,我們就能夠理解這個(gè)屬性的作用了。
通過(guò)以上的實(shí)驗(yàn),我們可以得出結(jié)論,如果我們不設(shè)置"adjust..."的屬性,對(duì)于沒(méi)有滾動(dòng)控件的布局來(lái)說(shuō),采用的是adjustPan方式,而對(duì)于有滾動(dòng)控件的布局,則是采用的adjustResize方式。
了解了上面的這些知識(shí)之后,我們就可以根據(jù)自己的需求設(shè)置不同的方式了。而且,關(guān)于如何使得界面加載的時(shí)候不顯示軟鍵盤(pán),我們也有了一個(gè)很清楚的認(rèn)識(shí)。
晚安,在假期里還在奮斗的程序員們。
- android 使用uinput模擬輸入設(shè)備的方法
- Android WebView 不支持 H5 input type="file" 解決方法
- Android 數(shù)據(jù)存儲(chǔ)之 FileInputStream 工具類(lèi)及FileInputStream類(lèi)的使用
- Android編程開(kāi)發(fā)之EditText中inputType屬性小結(jié)
- Android WebView支持input file啟用相機(jī)/選取照片功能
- Android網(wǎng)頁(yè)H5 Input選擇相機(jī)和系統(tǒng)相冊(cè)
- 詳解Android WebView的input上傳照片的兼容問(wèn)題
- Android自定義PasswordInputView密碼輸入
- Android InputMethodManager輸入法簡(jiǎn)介
- 從"Show?tabs"了解Android?Input系統(tǒng)
相關(guān)文章
android使用SkinManager實(shí)現(xiàn)換膚功能的示例
本篇文章主要介紹了android使用SkinManager實(shí)現(xiàn)換膚功能的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02使用Thumbnails實(shí)現(xiàn)圖片指定大小壓縮
這篇文章主要為大家詳細(xì)介紹了使用Thumbnails實(shí)現(xiàn)圖片指定大小壓縮,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08自己實(shí)現(xiàn)Android View布局流程
這篇文章主要介紹了自己實(shí)現(xiàn)Android View布局流程,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-03-03Android根據(jù)包名停止其他應(yīng)用程序的方法
這篇文章主要介紹了Android根據(jù)包名停止其他應(yīng)用程序,需要的朋友可以參考下2020-03-03Android 實(shí)現(xiàn)掃雷小游戲?qū)嵗a
這篇文章主要介紹了Android 實(shí)現(xiàn)掃雷小游戲?qū)嵗a的相關(guān)資料,需要的朋友可以參考下2016-12-12Android listview數(shù)據(jù)顯示及提示信息的實(shí)例
這篇文章主要介紹了Android listview數(shù)據(jù)顯示及提示信息的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05Android Gradle Plug 4.1.0 升級(jí)后gradle獲取manifest位置失敗問(wèn)題解決
這篇文章主要介紹了Android Gradle Plug 4.1.0 升級(jí)后gradle獲取manifest位置失敗問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Android中Handler實(shí)現(xiàn)倒計(jì)時(shí)的兩種方式
本篇文章主要介紹了Android中Handler實(shí)現(xiàn)倒計(jì)時(shí)的兩種方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07