EditText被軟鍵盤遮擋解決方案
最后的效果就是標(biāo)題欄不被頂上去洋机,并且EditText不能被軟件盤遮擋睹限,廢話不多說,直接上代碼:
import android.app.Activity;
import android.graphics.Rect;
import android.os.Build;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver;`
import android.view.WindowManager;
import android.widget.EditText;
import com.blankj.utilcode.util.KeyboardUtils;
public class KeyboardPatch {
private Activity activity;
private View decorView;
private View contentView;
private int srcPaddingBottm;
private boolean keyboardVisiable;
private int screenHeight;
/**
* @param act 需要解決bug的activity
* @param contentView 界面容器芹彬,最好是可滑動(dòng)的View玻熙,比如ScrollView等
*/
public KeyboardPatch(Activity act, View contentView) {
this.activity = act;
this.decorView = act.getWindow().getDecorView();
this.contentView = contentView;
srcPaddingBottm = contentView.getPaddingBottom();
screenHeight = decorView.getContext().getResources().getDisplayMetrics().heightPixels;
}
/**
* 監(jiān)聽layout變化
*/
public void enable() {
//activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
if (Build.VERSION.SDK_INT >= 19) {
decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);
//主要為了體驗(yàn)優(yōu)化,滑動(dòng)或者觸摸非焦點(diǎn)EditTexit的時(shí)候隱藏鍵盤宏多,當(dāng)然也可以去掉該監(jiān)聽
contentView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {
if (keyboardVisiable) {
KeyboardUtils.hideSoftInput(contentView);
}
}
return false;
}
});
}
}
/**
* 取消監(jiān)聽
*/
public void disable() {
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();
//獲取可見窗口的frame儿惫,主要是獲取r.bottom
decorView.getWindowVisibleDisplayFrame(r);
//判斷軟鍵盤是否彈起
keyboardVisiable = screenHeight - r.bottom >= 0;
//尋找獲得焦點(diǎn)的view
View focusView = decorView.findFocus();
if (focusView != null && focusView instanceof EditText) {
int[] location = new int[2];
focusView.getLocationOnScreen(location);
//如果focusView的高度很高的話,可以不必都顯示出來
int focusBottom = location[1] + focusView.getMeasuredHeight();
//獲取焦點(diǎn)的EditText的最底部和可見窗口的最底部的差值
int diff = focusBottom - r.bottom;
//如果大于0伸但,說明被遮擋了肾请,需要添加paddingBottom的值增加diff,并且需要把焦點(diǎn)view滑動(dòng)上來更胖,如果小于0铛铁,說明不存在遮擋,還原即可
if (diff > 0) {
if (srcPaddingBottm != diff) {
contentView.setPadding(contentView.getPaddingLeft(), contentView.getPaddingTop(), contentView.getPaddingRight(), diff + srcPaddingBottm);
contentView.scrollBy(0, diff);
}
} else {
if (contentView.getPaddingBottom() != 0) {
contentView.setPadding(contentView.getPaddingLeft(), contentView.getPaddingTop(), contentView.getPaddingRight(), srcPaddingBottm);
}
}
}
}
};
}