設(shè)置不自動(dòng)彈出軟鍵盤的最簡(jiǎn)潔解決方案
在Activity的清單文件中,添加屬性
android:windowSoftInputMode="stateHidden"
如下
<activity
android:name=".PulishSellInfoActivity"
android:windowSoftInputMode="stateHidden" >
</activity>
android:windowSoftInputMode屬性
上面簡(jiǎn)單的介紹了一下如何實(shí)現(xiàn)軟鍵盤不自動(dòng)彈出,使用的方法是設(shè)置android:windowSoftInputMode屬性。那么买鸽,這個(gè)屬性到底是干什么的式塌,他有什么作用呢林艘?這一節(jié)墓陈,就是探索android:windowSoftInputMode屬性的作用的井仰。
首先埋嵌,我們從這個(gè)屬性的名稱中,可以很直觀的看出它的作用俱恶,這個(gè)屬性就是來(lái)設(shè)置窗口軟鍵盤的交互模式的雹嗦。
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è)置。那么聪全,這些取值到底是怎么影響到軟鍵盤與窗口之間的交互的呢捶惜?下面,我們就一個(gè)個(gè)的測(cè)試這9個(gè)取值荔烧,到底是如何影響軟鍵盤的顯示的吱七。
1.stateUnspecified
中文意思是未指定狀態(tài),當(dāng)我們沒(méi)有設(shè)置android:windowSoftInputMode屬性的時(shí)候鹤竭,軟件默認(rèn)采用的就是這種交互方式踊餐,系統(tǒng)會(huì)根據(jù)界面采取相應(yīng)的軟鍵盤的顯示模式,比如臀稚,當(dāng)界面上只有文本和按鈕的時(shí)候吝岭,軟鍵盤就不會(huì)自動(dòng)彈出,因?yàn)闆](méi)有輸入的必要吧寺。那么窜管,當(dāng)界面上出現(xiàn)了獲取了焦點(diǎn)的輸入框的時(shí)候,軟鍵盤會(huì)不會(huì)自動(dòng)的彈出呢稚机?這個(gè)還真不一定幕帆!比如,在下面的這個(gè)界面布局中赖条,軟鍵盤并不會(huì)自動(dòng)彈出失乾。
就是說(shuō),默認(rèn)的纬乍,在這種界面情況下碱茁,系統(tǒng)并不確定用戶是否需要軟鍵盤,因此不會(huì)自動(dòng)彈出仿贬。但是纽竣,為什么說(shuō)不一定呢?這是因?yàn)椋绻覀冊(cè)谶@個(gè)布局的外面蜓氨,包裹上一個(gè)
ScrollView聋袋,軟鍵盤就會(huì)自動(dòng)的彈出來(lái)了!
如下语盈,在這種布局文件下舱馅,軟鍵盤會(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)不彈出軟鍵盤的缠借,但是當(dāng)有獲得焦點(diǎn)的輸入框的界面有滾動(dòng)的需求的時(shí)候,會(huì)自動(dòng)彈出軟鍵盤宜猜。至于為什么非要強(qiáng)調(diào)要獲取焦點(diǎn)的輸入框泼返,這是因?yàn)椋绻皇禽斎肟颢@取焦點(diǎn)姨拥,軟鍵盤也是不會(huì)自動(dòng)彈出的绅喉,讓界面不自動(dòng)彈出軟鍵盤的其中一個(gè)解決方案,就是在xml文件中叫乌,設(shè)置一個(gè)非輸入框控件獲取焦點(diǎn)柴罐,從而阻止鍵盤彈出。
2.stateUnchanged
中文的意思就是狀態(tài)不改變的意思憨奸,我們應(yīng)該怎么理解這句話呢革屠?其實(shí)很好理解,就是說(shuō)排宰,當(dāng)前界面的軟鍵盤狀態(tài)似芝,取決于上一個(gè)界面的軟鍵盤狀態(tài)。舉個(gè)例子板甘,假如當(dāng)前界面鍵盤是隱藏的党瓮,那么跳轉(zhuǎn)之后的界面,軟鍵盤也是隱藏的盐类;如果當(dāng)前界面是顯示的麻诀,那么跳轉(zhuǎn)之后的界面,軟鍵盤也是顯示狀態(tài)傲醉。
3.stateHidden
顧名思義蝇闭,如果我們?cè)O(shè)置了這個(gè)屬性,那么鍵盤狀態(tài)一定是隱藏的硬毕,不管上個(gè)界面什么狀態(tài)呻引,也不管當(dāng)前界面有沒(méi)有輸入的需求,反正就是不顯示吐咳。因此逻悠,我們可以設(shè)置這個(gè)屬性元践,來(lái)控制軟鍵盤不自動(dòng)的彈出。
4.stateAlwaysHidden
這個(gè)屬性也可以讓軟鍵盤隱藏童谒,但是我暫時(shí)還不知道和stateHidden屬性的區(qū)別单旁,本來(lái)想去stackOverFlow上問(wèn)一下的,但是饥伊,Great Wall象浑,呵呵呵...祝愿病魔早日戰(zhàn)勝方校長(zhǎng)
5.stateVisible
設(shè)置為這個(gè)屬性,可以將軟鍵盤召喚出來(lái)琅豆,即使在界面上沒(méi)有輸入框的情況下也可以強(qiáng)制召喚出來(lái)愉豺。
6.stateAlwaysVisible
這個(gè)屬性也是可以將鍵盤召喚出來(lái),但是與stateVisible屬性有小小的不同之處茫因。舉個(gè)例子蚪拦,當(dāng)我們?cè)O(shè)置為stateVisible屬性,如果當(dāng)前的界面鍵盤是顯示的冻押,當(dāng)我們點(diǎn)擊按鈕跳轉(zhuǎn)到下個(gè)界面的時(shí)候驰贷,軟鍵盤會(huì)因?yàn)檩斎肟蚴ソ裹c(diǎn)而隱藏起來(lái),當(dāng)我們?cè)俅位氐疆?dāng)前界面的時(shí)候洛巢,鍵盤這個(gè)時(shí)候是隱藏的括袒。但是如果我們?cè)O(shè)置為stateAlwaysVisible,我們跳轉(zhuǎn)到下個(gè)界面狼渊,軟鍵盤還是隱藏的箱熬,但是當(dāng)我們?cè)俅位貋?lái)的時(shí)候,軟鍵盤是會(huì)顯示出來(lái)的狈邑。所以城须,這個(gè)Always就解釋了這個(gè)區(qū)別,不管什么情況到達(dá)當(dāng)前界面(正常跳轉(zhuǎn)或者是上一個(gè)界面被用戶返回)米苹,軟鍵盤都是顯示狀態(tài)糕伐。
說(shuō)到這里,我聯(lián)想到了上面的stateHidden和stateAlwaysHidden蘸嘶,我估計(jì)區(qū)別也是這樣的良瞧,就是說(shuō),stateAlwaysHidden無(wú)論如何都是隱藏的训唱,但是如果在跳轉(zhuǎn)到下個(gè)界面的時(shí)候褥蚯,軟鍵盤被召喚出來(lái)了,那么當(dāng)下個(gè)界面被用戶返回的時(shí)候况增,鍵盤應(yīng)該是不會(huì)被隱藏的赞庶,但是,我還沒(méi)有找到能夠跳轉(zhuǎn)到下個(gè)界面,還讓當(dāng)前界面軟鍵盤不消失的方法歧强,所以暫時(shí)不能驗(yàn)證澜薄。
7.adjustUnspecified
從這個(gè)屬性開始,就不是設(shè)置軟鍵盤的顯示與隱藏模式了摊册,而是設(shè)置軟鍵盤與軟件的顯示內(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)的界面的大小戒悠,從而保證即使軟鍵盤顯示出來(lái)了熬荆,也能夠看到所有的內(nèi)容。如果布局里面沒(méi)有滾動(dòng)的控件绸狐,那么軟鍵盤可能就會(huì)蓋住一些內(nèi)容卤恳,我們從下面的圖中可以看出差別。
沒(méi)有滾動(dòng)控件寒矿,軟鍵盤下面的布局都被遮擋住了突琳,若想修改,只能隱藏軟鍵盤符相,然后選擇拆融。而且,重點(diǎn)注意一下上面的布局啊终,當(dāng)我們選擇的輸入框偏下的時(shí)候镜豹,上面的標(biāo)題欄和布局被軟鍵盤頂上去了。記住這個(gè)特征蓝牲,因?yàn)楹竺嬗袀€(gè)屬性和這個(gè)的效果不一樣趟脂。
布局里面有滑動(dòng)控件,系統(tǒng)會(huì)自動(dòng)的縮小整個(gè)界面的大小例衍,因此昔期,我們可以軟鍵盤上面的小區(qū)域中顯示所有的輸入框。
這就是兩中顯示模式之間的差別佛玄。
8.adjustResize
這個(gè)屬性表示Activity的主窗口總是會(huì)被調(diào)整大小硼一,從而保證軟鍵盤顯示空間。
我們先看顯示效果梦抢。
注意觀察這個(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)保證軟鍵盤的空間,而是采取了另外一種策略名挥,系統(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ō),則不太一樣鞋既,我們看下面的效果圖力九。
首先,這是軟鍵盤沒(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í)候不顯示軟鍵盤辜妓,我們也有了一個(gè)很清楚的認(rèn)識(shí)。
晚安忌怎,在假期里還在奮斗的程序員們籍滴。