Android EditText被軟鍵盤(pán)遮蓋的處理方法
這兩天android app新增了透明欄效果,結(jié)果發(fā)現(xiàn)鍵盤(pán)彈起后會(huì)遮蓋屏幕底部的EditText,沒(méi)有像想象中的調(diào)整窗口大小,并滾動(dòng)ScrollView,將EditText顯示在鍵盤(pán)上方。之前也遇到過(guò)類(lèi)似問(wèn)題,所以解決后就干脆寫(xiě)把所有關(guān)于EditText和鍵盤(pán)之間問(wèn)題和解決思路都記錄一下,以便以后查閱。
一、在5.0以前,如果EditText設(shè)置了gravity=“center|right”其中之一且同時(shí)設(shè)置了singleLine=“true”,就會(huì)導(dǎo)致屏幕底部的EditText連續(xù)點(diǎn)擊彈出鍵盤(pán)時(shí),從第二次開(kāi)會(huì)一直遮擋住EditText。
5.0+則不會(huì)有該問(wèn)題,解決辦法也簡(jiǎn)單,在EditText外層包裹ScrollView,并設(shè)置鍵盤(pán)模式為adjustResize模式即可(兩者缺一不可)。
二、按上面描述的解決辦法,一直沒(méi)什么問(wèn)題,直到最近加了透明欄效果,鍵盤(pán)模式仿佛直接失效,每次點(diǎn)擊底部EditText時(shí),鍵盤(pán)都從底部彈起,窗口大小也不會(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被鍵盤(pán)遮蓋問(wèn)題。
因?yàn)橥该鳈谛Ч菑?.4開(kāi)始支持,也就導(dǎo)致從4.4開(kāi)始項(xiàng)目就存在這個(gè)BUG,當(dāng)然只考慮5.0+的透明欄效果,可以直接設(shè)置狀態(tài)欄顏色實(shí)現(xiàn)透明欄效果,我這里由于項(xiàng)目需要必須要從4.4開(kāi)始支持,所以必須解決這個(gè)問(wèn)題。
正常情況下,系統(tǒng)UI會(huì)占用app一些空間,例如狀態(tài)欄、鍵盤(pán)、導(dǎo)航欄等,也就是說(shuō)我們的app UI不會(huì)出現(xiàn)在系統(tǒng)UI之下,但從測(cè)試結(jié)果來(lái)看,為了占用狀態(tài)欄空間或全屏,設(shè)置了上面的一些屬性后,就會(huì)被系統(tǒng)UI覆蓋。
解決方法:
監(jiān)聽(tīng)界面容器的layout變化,當(dāng)發(fā)生變化時(shí),通過(guò)檢查窗口可見(jiàn)區(qū)域高度,判斷鍵盤(pán)是否彈起,如果彈起,則修改容器bottom padding,也就是手動(dòng)實(shí)現(xiàn)adjustResize效果,給鍵盤(pán)留出顯示空間,這樣ScrollView也會(huì)自動(dòng)調(diào)整大小,將EditText顯示在鍵盤(pá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è)人需要傳遞 * */ public KeyboardPatch(Activity act, View contentView) { this.activity = act; this.decorView = act.getWindow().getDecorView(); this.contentView = contentView; } /** * 監(jiān)聽(tīng)layout變化 * */ public void enable() { activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); if (Build.VERSION.SDK_INT >= 19) { decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener); } } /** * 取消監(jiān)聽(tīng) * */ public void disable() { activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); if (Build.VERSION.SDK_INT >= 19) { decorView.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener); } } private ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); decorView.getWindowVisibleDisplayFrame(r); int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels; int diff = height - r.bottom; if (diff != 0) { if (contentView.getPaddingBottom() != diff) { contentView.setPadding(0, 0, 0, diff); } } else { if (contentView.getPaddingBottom() != 0) { contentView.setPadding(0, 0, 0, 0); } } } }; }
以上所述是小編給大家介紹的Android EditText被軟鍵盤(pán)遮蓋的處理方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
android中實(shí)現(xiàn)在ImageView上隨意畫(huà)線(xiàn)涂鴉的方法
今天小編就為大家分享一篇android中實(shí)現(xiàn)在ImageView上隨意畫(huà)線(xiàn)涂鴉的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10Android簡(jiǎn)單實(shí)用的可拖拽GridView組件分享
在我們?nèi)粘i_(kāi)發(fā)中,使用?GridView?這種網(wǎng)格視圖的場(chǎng)合還是不少的,本篇我們來(lái)介紹一個(gè)支持拖拽的?GridView?組件,可以輕松搞定網(wǎng)格視圖的拖拽排序,需要的可以參考一下2023-06-06Android自定義ImageView實(shí)現(xiàn)點(diǎn)擊兩張圖片切換效果
這篇文章主要為大家詳細(xì)介紹了Android自定義ImageView實(shí)現(xiàn)點(diǎn)擊兩張圖片切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Flutter狀態(tài)管理Provider的使用示例詳解
這篇文章主要為大家介紹了Flutter狀態(tài)管理Provider的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Flutter runApp GestureBinding使用介紹
這篇文章主要為大家介紹了Flutter runApp GestureBinding使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12詳解Android中通過(guò)Intent類(lèi)實(shí)現(xiàn)組件間調(diào)用的方法
Intent能夠?qū)崿F(xiàn)應(yīng)用間的數(shù)據(jù)交互與通訊,將實(shí)現(xiàn)者和調(diào)用者解耦,接下來(lái)就來(lái)詳解Android中通過(guò)Intent類(lèi)實(shí)現(xiàn)組件間調(diào)用的方法,需要的朋友可以參考下2016-05-05Android 開(kāi)發(fā)手機(jī)(三星)拍照應(yīng)用照片旋轉(zhuǎn)問(wèn)題解決辦法
這篇文章主要介紹了Android 開(kāi)發(fā)手機(jī)(三星)拍照應(yīng)用照片旋轉(zhuǎn)問(wèn)題解決辦法的相關(guān)資料,需要的朋友可以參考下2017-04-04