Android—登錄界面軟鍵盤適配

一、軟鍵盤屬性

1. 屬性介紹

軟鍵盤的交互屬性通過android:windowSoftInputMode設(shè)置疾棵,該屬性的設(shè)置主要包含兩個(gè)方面打毛。
第1:在當(dāng)前Activity獲取焦點(diǎn)時(shí)軟鍵盤是隱藏還是可見。屬性如下:

屬性 說明
stateAlwaysHidden 一直隱藏軟鍵盤
stateAlwaysVisible 打開Activity即顯示軟鍵盤
stateHidden 默認(rèn)隱藏趋急,EditText獲取焦點(diǎn)時(shí)顯示
stateVisible 默認(rèn)顯示
stateUnchanged
stateUnspecified

第2:是否根據(jù)軟鍵盤的顯示調(diào)整主窗口的尺寸或平移主窗口顶伞。

屬性 說明
adjustNothing 不調(diào)整主窗口饵撑,直接覆蓋
adjustPan 如果焦點(diǎn)位置距離屏幕底部距離小于軟鍵盤高度,則把整個(gè)布局頂上去到焦點(diǎn)位置唆貌,不壓縮多余空間滑潘,否則同adjustNothing
adjustResize 重新分配多余空間,保證輸入內(nèi)容不會(huì)被輸入法覆蓋锨咙,值得注意的是:全屏狀態(tài)下语卤,adjustResize屬性會(huì)被忽略
adjustUnspecified 由系統(tǒng)決定(默認(rèn)配置)

2. 屬性應(yīng)用示例

下面來看在各個(gè)屬性下軟鍵盤彈出的表現(xiàn),測(cè)試時(shí)主要集中在第2類屬性,第1類屬性均使用stateHidden粹舵,也就是剛進(jìn)入界面時(shí)軟鍵盤默認(rèn)隱藏钮孵,當(dāng)EditText獲得焦點(diǎn)時(shí)彈出軟鍵盤。
測(cè)試所使用的頁(yè)面如下眼滤,其根布局是一個(gè)<LinearLayout>巴席。

test.png

1. adjustNothing
可以發(fā)現(xiàn)軟鍵盤彈出之后直接覆蓋在了原布局之上,如果EditText上方的布局高度較大的話诅需,軟鍵盤就會(huì)將EditText覆蓋住漾唉,導(dǎo)致用戶無法看到輸入框里的內(nèi)容。

test_adjustNothing.png

2. adjustPan
在測(cè)試界面下堰塌,EditText到底部的距離小于軟鍵盤的高度赵刑,當(dāng)軟鍵盤彈出時(shí),整體的布局被頂起來以便顯示獲取焦點(diǎn)的EditText蔫仙。此時(shí)上方的背景圖會(huì)出現(xiàn)顯示不全的情況料睛。

test_adjustPan.png

3. adjustResize
在測(cè)試界面下,adjustResize和adjustNothing的效果是一樣的摇邦。

test_adjustResize.png

再看下adjustResize的說明,該屬性下會(huì)重新分配多余空間屎勘,來顯示獲得焦點(diǎn)的EditText施籍。而這里使用的測(cè)試界面根布局是線性布局,視圖之間的間隔使用margin特定的值概漱,不存在多余空間供分配丑慎。

現(xiàn)在嘗試將界面的根布局改為<ScrollView>。彈出軟鍵盤后的效果如下瓤摧。點(diǎn)擊EditText后竿裂,ScrollView會(huì)滾動(dòng)調(diào)整當(dāng)前顯示的區(qū)域,使獲得焦點(diǎn)的EditText正常顯示照弥,這時(shí)又和adjustPan相似腻异。

test_adjustResize2.png

二、登錄界面軟鍵盤解決方案

來看這樣一種場(chǎng)景:有個(gè)登錄界面这揣,該界面頂部有圖或者有背景圖片悔常。但是EditText位于界面偏下方,如果將軟鍵盤覆蓋在上面给赞,那么EditText獲取焦點(diǎn)時(shí)是不可見的机打。該界面如下所示。

experiment1.png

下面來為該界面適配軟鍵盤片迅,首先將鍵盤的屬性設(shè)置為adjustPan残邀,效果如下。此時(shí)背景圖已經(jīng)頂出屏幕邊緣,導(dǎo)致背景圖顯示不完整芥挣。

experiment1_adjustPan.png

將鍵盤屬性改為adjustResize時(shí)效果如下膳汪,由于不存在多余的空間可供分配,效果和adjustNothing相同九秀,軟鍵盤直接覆蓋在了原布局上遗嗽。

experiment1_adjustResize.png

那么怎么樣才能同時(shí)使背景圖片和EditText顯示完整呢?
我們平時(shí)隔開布局一般使用margin屬性鼓蜒,這時(shí)View之間的間距都是固定的痹换,即使設(shè)置adjustResize屬性,也不存在多余的空間可供分配都弹。而如果使用weight來表示間隔娇豫,那么在軟鍵盤彈出之后,整體的布局高度縮減畅厢,weight的空間又會(huì)被重新分配冯痢。

現(xiàn)將Activity布局文件修改如下,根布局使用<ScrollView>并設(shè)置android:fillViewport="true"框杜,這樣其內(nèi)部的控件就會(huì)實(shí)現(xiàn)match_parent的效果浦楣。

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    ......
    android:orientation="vertical"
    android:fillViewport="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <ImageView
            ....../>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:orientation="vertical">
            <View
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"/>
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="登錄之后即可進(jìn)行操作"/>
            <View
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"/>
            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>
            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>
        </LinearLayout>

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="login"/>
    </LinearLayout>

</ScrollView>

該布局下的界面如下所示。

experiment1_common.png

彈出軟鍵盤后的效果如下所示咪辱,由于軟鍵盤占據(jù)了一定的高度振劳,整體界面的高度減小,可供weight所分配的空間就減小了油狂,這就是adjustResize的作用历恐。

experiment1_resize.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市专筷,隨后出現(xiàn)的幾起案子弱贼,更是在濱河造成了極大的恐慌,老刑警劉巖磷蛹,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吮旅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡弦聂,警方通過查閱死者的電腦和手機(jī)鸟辅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莺葫,“玉大人匪凉,你說我怎么就攤上這事∞嗝剩” “怎么了再层?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我聂受,道長(zhǎng)蒿秦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任蛋济,我火速辦了婚禮棍鳖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碗旅。我一直安慰自己渡处,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布祟辟。 她就那樣靜靜地躺著医瘫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旧困。 梳的紋絲不亂的頭發(fā)上醇份,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音吼具,去河邊找鬼僚纷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛馍悟,可吹牛的內(nèi)容都是我干的畔濒。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼锣咒,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了赞弥?” 一聲冷哼從身側(cè)響起毅整,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绽左,沒想到半個(gè)月后悼嫉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拼窥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年戏蔑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鲁纠。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡总棵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出改含,到底是詐尸還是另有隱情情龄,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站骤视,受9級(jí)特大地震影響鞍爱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜专酗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一睹逃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧祷肯,春花似錦沉填、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至允青,卻和暖如春橄碾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颠锉。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工法牲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人琼掠。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓拒垃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瓷蛙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悼瓮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361