這兩天android app新增了透明欄效果,結(jié)果發(fā)現(xiàn)鍵盤彈起后會(huì)遮蓋屏幕底部的EditText,沒有像想象中的調(diào)整窗口大小,并滾動(dòng)ScrollView,將EditText顯示在鍵盤上方。之前也遇到過類似問題,所以解決后就干脆寫把所有關(guān)于EditText和鍵盤之間問題和解決思路都記錄一下,以便以后查閱。

 

  一、在5.0以前,如果EditText設(shè)置了gravity=“center|right”其中之一且同時(shí)設(shè)置了singleLine=“true”,就會(huì)導(dǎo)致屏幕底部的EditText連續(xù)點(diǎn)擊彈出鍵盤時(shí),從第二次開會(huì)一直遮擋住EditText。

  5.0+則不會(huì)有該問題,解決辦法也簡(jiǎn)單,在EditText外層包裹ScrollView,并設(shè)置鍵盤模式為adjustResize模式即可(兩者缺一不可)。

 

  二、按上面描述的解決辦法,一直沒什么問題,直到最近加了透明欄效果,鍵盤模式仿佛直接失效,每次點(diǎn)擊底部EditText時(shí),鍵盤都從底部彈起,窗口大小也不會(huì)調(diào)整,底部EditText也會(huì)被遮蓋。最后發(fā)現(xiàn)是當(dāng)使用getWindow().getDecorView().setSystemUiVisibility方法設(shè)置了SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN或SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION ,或者設(shè)置了 window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)時(shí),會(huì)引發(fā)EditText被鍵盤遮蓋問題。

  因?yàn)橥该鳈谛Ч菑?.4開始支持,也就導(dǎo)致從4.4開始項(xiàng)目就存在這個(gè)BUG,當(dāng)然只考慮5.0+的透明欄效果,可以直接設(shè)置狀態(tài)欄顏色實(shí)現(xiàn)透明欄效果,我這里由于項(xiàng)目需要必須要從4.4開始支持,所以必須解決這個(gè)問題。

  正常情況下,系統(tǒng)UI會(huì)占用app一些空間,例如狀態(tài)欄、鍵盤、導(dǎo)航欄等,也就是說我們的app UI不會(huì)出現(xiàn)在系統(tǒng)UI之下,但從測(cè)試結(jié)果來看,為了占用狀態(tài)欄空間或全屏,設(shè)置了上面的一些屬性后,就會(huì)被系統(tǒng)UI覆蓋。

  解決方法:監(jiān)聽界面容器的layout變化,當(dāng)發(fā)生變化時(shí),通過檢查窗口可見區(qū)域高度,判斷鍵盤是否彈起,如果彈起,則修改容器bottom padding,也就是手動(dòng)實(shí)現(xiàn)adjustResize效果,給鍵盤留出顯示空間,這樣ScrollView也會(huì)自動(dòng)調(diào)整大小,將EditText顯示在鍵盤上方。

 

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

public class KeyboardPatch
{    private Activity activity;    private View decorView;    private View contentView;    /**
     * 構(gòu)造函數(shù)
     * @param act 需要解決bug的activity
     * @param contentView 界面容器,activity中一般是R.id.content,也可能是Fragment的容器,根據(jù)個(gè)人需要傳遞
     * */
 &