本文工具轉(zhuǎn)載自:https://blog.csdn.net/passerby_b/article/details/82686662
使用方法:
activity 的onCreate() 中設(shè)置
SoftHideKeyBoardUtil.assistActivity(this);
工具類(lèi):
public class SoftHideKeyBoardUtil {
? ? public static void assistActivity(Activity activity) {
? ? ? ? new SoftHideKeyBoardUtil(activity);
? ? }
? ? private View mChildOfContent;
? ? private int usableHeightPrevious;
? ? private FrameLayout.LayoutParams frameLayoutParams;
? ? //為適應(yīng)華為小米等手機(jī)鍵盤(pán)上方出現(xiàn)黑條或不適配
? ? private int contentHeight;//獲取setContentView本來(lái)view的高度
? ? private boolean isfirst = true;//只用獲取一次
? ? private int statusBarHeight;//狀態(tài)欄高度
? ? private SoftHideKeyBoardUtil(Activity activity) {
? ? ? ? //1?找到Activity的最外層布局控件边篮,它其實(shí)是一個(gè)DecorView,它所用的控件就是FrameLayout
? ? ? ? FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
? ? ? ? //2?獲取到setContentView放進(jìn)去的View
? ? ? ? mChildOfContent = content.getChildAt(0);
? ? ? ? //3?給Activity的xml布局設(shè)置View樹(shù)監(jiān)聽(tīng),當(dāng)布局有變化奏甫,如鍵盤(pán)彈出或收起時(shí)戈轿,都會(huì)回調(diào)此監(jiān)聽(tīng)?
? ? ? ? mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
? ? ? ? ? ? //4?軟鍵盤(pán)彈起會(huì)使GlobalLayout發(fā)生變化
? ? ? ? ? ? public void onGlobalLayout() {
? ? ? ? ? ? ? ? if (isfirst) {
? ? ? ? ? ? ? ? ? ? contentHeight = mChildOfContent.getHeight();//兼容華為等機(jī)型
? ? ? ? ? ? ? ? ? ? isfirst = false;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //5?當(dāng)前布局發(fā)生變化時(shí),對(duì)Activity的xml布局進(jìn)行重繪
? ? ? ? ? ? ? ? possiblyResizeChildOfContent();
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? //6?獲取到Activity的xml布局的放置參數(shù)
? ? ? ? frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
? ? }
? ? // 獲取界面可用高度阵子,如果軟鍵盤(pán)彈起后思杯,Activity的xml布局可用高度需要減去鍵盤(pán)高度?
? ? private void possiblyResizeChildOfContent() {
? ? ? ? //1?獲取當(dāng)前界面可用高度,鍵盤(pán)彈起后挠进,當(dāng)前界面可用布局會(huì)減少鍵盤(pán)的高度
? ? ? ? int usableHeightNow = computeUsableHeight();
? ? ? ? //2?如果當(dāng)前可用高度和原始值不一樣
? ? ? ? if (usableHeightNow != usableHeightPrevious) {
? ? ? ? ? ? //3?獲取Activity中xml中布局在當(dāng)前界面顯示的高度
? ? ? ? ? ? int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
? ? ? ? ? ? //4?Activity中xml布局的高度-當(dāng)前可用高度
? ? ? ? ? ? int heightDifference = usableHeightSansKeyboard - usableHeightNow;
? ? ? ? ? ? //5?高度差大于屏幕1/4時(shí)色乾,說(shuō)明鍵盤(pán)彈出
? ? ? ? ? ? if (heightDifference > (usableHeightSansKeyboard / 4)) {
? ? ? ? ? ? ? ? // 6?鍵盤(pán)彈出了,Activity的xml布局高度應(yīng)當(dāng)減去鍵盤(pán)高度
? ? ? ? ? ? ? ? if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
? ? ? ? ? ? ? ? ? ? frameLayoutParams.height = usableHeightSansKeyboard - heightDifference + statusBarHeight;
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? frameLayoutParams.height = contentHeight;
? ? ? ? ? ? }
? ? ? ? ? ? //7? 重繪Activity的xml布局
? ? ? ? ? ? mChildOfContent.requestLayout();
? ? ? ? ? ? usableHeightPrevious = usableHeightNow;
? ? ? ? }
? ? }
? ? private int computeUsableHeight() {
? ? ? ? Rect r = new Rect();
? ? ? ? mChildOfContent.getWindowVisibleDisplayFrame(r);
? ? ? ? // 全屏模式下:直接返回r.bottom领突,r.top其實(shí)是狀態(tài)欄的高度
? ? ? ? return (r.bottom - r.top);
? ? }
}