鍵盤(pán)彈出以后Activity的布局方式

背景:
在很多App開(kāi)發(fā)過(guò)程中需要在Activity中監(jiān)聽(tīng)Android設(shè)備的軟鍵盤(pán)彈起與關(guān)閉相赁,但是Android似乎沒(méi)有提供相關(guān)的的監(jiān)聽(tīng)API給我們來(lái)調(diào)用废封,本文提供了一個(gè)可行的辦法來(lái)監(jiān)聽(tīng)軟鍵盤(pán)的彈起與關(guān)閉。

預(yù)備知識(shí):
在manifest文件中可以設(shè)置Activity的android:windowSoftInputMode屬性登夫,這個(gè)屬性值常見(jiàn)的設(shè)置如下:
android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
那么這里值的含義列表如下:
【A】stateUnspecified:軟鍵盤(pán)的狀態(tài)并沒(méi)有指定拷邢,系統(tǒng)將選擇一個(gè)合適的狀態(tài)或依賴于主題的設(shè)置
【B】stateUnchanged:當(dāng)這個(gè)activity出現(xiàn)時(shí),軟鍵盤(pán)將一直保持在上一個(gè)activity里的狀態(tài)平斩,無(wú)論是隱藏還是顯示
【C】stateHidden:用戶選擇activity時(shí)亚享,軟鍵盤(pán)總是被隱藏
【D】stateAlwaysHidden:當(dāng)該Activity主窗口獲取焦點(diǎn)時(shí),軟鍵盤(pán)也總是被隱藏的
【E】stateVisible:軟鍵盤(pán)通常是可見(jiàn)的
【F】stateAlwaysVisible:用戶選擇activity時(shí)绘面,軟鍵盤(pán)總是顯示的狀態(tài)
【G】adjustUnspecified:默認(rèn)設(shè)置欺税,通常由系統(tǒng)自行決定是隱藏還是顯示
【H】adjustResize:該Activity總是調(diào)整屏幕的大小以便留出軟鍵盤(pán)的空間
【I】adjustPan:當(dāng)前窗口的內(nèi)容將自動(dòng)移動(dòng)以便當(dāng)前焦點(diǎn)從不被鍵盤(pán)覆蓋和用戶能總是看到輸入內(nèi)容的部分

示例:
(1)首先我們需要將監(jiān)聽(tīng)所在的Activity在Manifest文件中的設(shè)置為如下形式:

<activity  
    android:name="com.bear.softkeyboardlistener.MainActivity"  
    android:label="@string/app_name"  
    android:windowSoftInputMode="stateAlwaysHidden|adjustResize" >  
    <intent-filter>  
        <action android:name="android.intent.action.MAIN" />  
  
        <category android:name="android.intent.category.LAUNCHER" />  
    </intent-filter>  
</activity>  

這樣設(shè)置之后,當(dāng)有軟鍵盤(pán)彈起來(lái)的時(shí)候揭璃,Activity的布局大小會(huì)被壓縮上去晚凿,但是你仍然可以通過(guò)滑動(dòng)瀏覽所有。

(2)我們要為Activity的最外面的Layout設(shè)置一個(gè)OnLayoutChangeListener監(jiān)聽(tīng)器:

public class MainActivity extends Activity implements OnLayoutChangeListener{  
      
    //Activity最外層的Layout視圖  
    private View activityRootView;  
    //屏幕高度  
    private int screenHeight = 0;  
    //軟件盤(pán)彈起后所占高度閥值  
    private int keyHeight = 0;  
      
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        activityRootView = findViewById(R.id.root_layout);  
        //獲取屏幕高度  
        screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();  
        //閥值設(shè)置為屏幕高度的1/3  
        keyHeight = screenHeight/3;  
    }  
      
    @Override  
    protected void onResume() {  
        super.onResume();  
          
        //添加layout大小發(fā)生改變監(jiān)聽(tīng)器  
        activityRootView.addOnLayoutChangeListener(this);  
    }  
      
    @Override  
    public void onLayoutChange(View v, int left, int top, int right,  
            int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {  
          
        //old是改變前的左上右下坐標(biāo)點(diǎn)值瘦馍,沒(méi)有old的是改變后的左上右下坐標(biāo)點(diǎn)值  
          
//      System.out.println(oldLeft + " " + oldTop +" " + oldRight + " " + oldBottom);  
//      System.out.println(left + " " + top +" " + right + " " + bottom);  
          
          
        //現(xiàn)在認(rèn)為只要控件將Activity向上推的高度超過(guò)了1/3屏幕高歼秽,就認(rèn)為軟鍵盤(pán)彈起  
        if(oldBottom != 0 && bottom != 0 &&(oldBottom - bottom > keyHeight)){  
              
            Toast.makeText(MainActivity.this, "監(jiān)聽(tīng)到軟鍵盤(pán)彈起...", Toast.LENGTH_SHORT).show();  
          
        }else if(oldBottom != 0 && bottom != 0 &&(bottom - oldBottom > keyHeight)){  
              
            Toast.makeText(MainActivity.this, "監(jiān)聽(tīng)到軟件盤(pán)關(guān)閉...", Toast.LENGTH_SHORT).show();  
          
        }  
          
    }  

寫(xiě)文章不易,路過(guò)的伙伴辛苦點(diǎn)個(gè)贊情组,謝謝支持燥筷!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市院崇,隨后出現(xiàn)的幾起案子肆氓,更是在濱河造成了極大的恐慌,老刑警劉巖底瓣,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谢揪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)键耕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)寺滚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人屈雄,你說(shuō)我怎么就攤上這事村视。” “怎么了酒奶?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蚁孔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我惋嚎,道長(zhǎng)杠氢,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任另伍,我火速辦了婚禮鼻百,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摆尝。我一直安慰自己温艇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布堕汞。 她就那樣靜靜地躺著勺爱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讯检。 梳的紋絲不亂的頭發(fā)上琐鲁,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音人灼,去河邊找鬼围段。 笑死,一個(gè)胖子當(dāng)著我的面吹牛投放,可吹牛的內(nèi)容都是我干的奈泪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼跪呈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了取逾?” 一聲冷哼從身側(cè)響起耗绿,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砾隅,沒(méi)想到半個(gè)月后误阻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年究反,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寻定。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡精耐,死狀恐怖狼速,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卦停,我是刑警寧澤向胡,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站惊完,受9級(jí)特大地震影響僵芹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜小槐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一拇派、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凿跳,春花似錦件豌、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至躬审,卻和暖如春棘街,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背承边。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工遭殉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人博助。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓险污,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親富岳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛔糯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容