Android EditText被軟鍵盤遮蓋的處理方法
這兩天android app新增了透明欄效果,結(jié)果發(fā)現(xiàn)鍵盤彈起后會遮蓋屏幕底部的EditText,沒有像想象中的調(diào)整窗口大小,并滾動ScrollView,將EditText顯示在鍵盤上方。之前也遇到過類似問題,所以解決后就干脆寫把所有關(guān)于EditText和鍵盤之間問題和解決思路都記錄一下,以便以后查閱。
一、在5.0以前,如果EditText設(shè)置了gravity=“center|right”其中之一且同時設(shè)置了singleLine=“true”,就會導(dǎo)致屏幕底部的EditText連續(xù)點擊彈出鍵盤時,從第二次開會一直遮擋住EditText。
5.0+則不會有該問題,解決辦法也簡單,在EditText外層包裹ScrollView,并設(shè)置鍵盤模式為adjustResize模式即可(兩者缺一不可)。
二、按上面描述的解決辦法,一直沒什么問題,直到最近加了透明欄效果,鍵盤模式仿佛直接失效,每次點擊底部EditText時,鍵盤都從底部彈起,窗口大小也不會調(diào)整,底部EditText也會被遮蓋。最后發(fā)現(xiàn)是當使用getWindow().getDecorView().setSystemUiVisibility方法設(shè)置了SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN或SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION ,或者設(shè)置了 window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)時,會引發(fā)EditText被鍵盤遮蓋問題。
因為透明欄效果是從4.4開始支持,也就導(dǎo)致從4.4開始項目就存在這個BUG,當然只考慮5.0+的透明欄效果,可以直接設(shè)置狀態(tài)欄顏色實現(xiàn)透明欄效果,我這里由于項目需要必須要從4.4開始支持,所以必須解決這個問題。
正常情況下,系統(tǒng)UI會占用app一些空間,例如狀態(tài)欄、鍵盤、導(dǎo)航欄等,也就是說我們的app UI不會出現(xiàn)在系統(tǒng)UI之下,但從測試結(jié)果來看,為了占用狀態(tài)欄空間或全屏,設(shè)置了上面的一些屬性后,就會被系統(tǒng)UI覆蓋。
解決方法:
監(jiān)聽界面容器的layout變化,當發(fā)生變化時,通過檢查窗口可見區(qū)域高度,判斷鍵盤是否彈起,如果彈起,則修改容器bottom padding,也就是手動實現(xiàn)adjustResize效果,給鍵盤留出顯示空間,這樣ScrollView也會自動調(diào)整大小,將EditText顯示在鍵盤上方。
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ù)個人需要傳遞
* */
public KeyboardPatch(Activity act, View contentView)
{
this.activity = act;
this.decorView = act.getWindow().getDecorView();
this.contentView = contentView;
}
/**
* 監(jiān)聽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)聽
* */
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被軟鍵盤遮蓋的處理方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
基于Android中dp和px之間進行轉(zhuǎn)換的實現(xiàn)代碼
本篇文章是對在Android中dp和px之間進行轉(zhuǎn)換的實現(xiàn)方法進行了分析介紹,需要的朋友參考下2013-05-05
詳解Retrofit2.0 公共參數(shù)(固定參數(shù))
這篇文章主要介紹了Retrofit2.0 公共參數(shù)(固定參數(shù)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04
Android獲取WebView加載url的請求錯誤碼 【推薦】
這篇文章主要介紹了Android獲取WebView加載url的請求錯誤碼 ,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-06-06
Android自定義View實現(xiàn)抽獎轉(zhuǎn)盤
這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)抽獎轉(zhuǎn)盤,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12

