最近做项目中遇到Android全屏中adjustResize失效的问题,网上搜索了一堆后,基本上都是使用AndroidBug5497Workaround这个工具类,但是在实际使用中遇到软键盘不弹出时,整体高度不正确的问题。看了工具类的代码后,觉得计算全屏高度的方式有些绕了,既然Activity已经全屏,索性直接将屏幕高度作为软键盘不弹出的高度。代码如下:

package com.kunpeng.util;import android.app.Activity;import android.graphics.Rect;import android.os.Build.VERSION;import android.os.Build.VERSION_CODES;import android.view.View;import android.view.ViewTreeObserver;import android.widget.FrameLayout;/** * 用于解决全屏时,Activity设置了adjustSize却不起作用的问题。setContentView之后调用{@link #assistActivity(Activity)} */public class AndroidBug5497Workaround {    // For more information, see https://code.google.com/p/android/issues/detail?id=5497    // To use this class, simply invoke assistActivity() on an Activity that already has its content view set.    public static void assistActivity (Activity activity) {        new AndroidBug5497Workaround(activity);    }    private Activity activity;    private View mChildOfContent;    private int usableHeightPrevious;    private FrameLayout.LayoutParams frameLayoutParams;    private int screenHeight;    private AndroidBug5497Workaround(Activity activity) {        this.activity = activity;        FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);        mChildOfContent = content.getChildAt(0);        mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {            public void onGlobalLayout() {                possiblyResizeChildOfContent();            }        });        frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();        screenHeight = activity.getResources().getDisplayMetrics().heightPixels;    }    private void possiblyResizeChildOfContent() {        int usableHeightNow = computeUsableHeight();        if (usableHeightNow != usableHeightPrevious) {//            int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();            int usableHeightSansKeyboard = screenHeight;            //这个判断是为了解决19之前的版本不支持沉浸式状态栏导致布局显示不完全的问题            if(VERSION.SDK_INT < VERSION_CODES.KITKAT){                int statusBarHeight = getStatusBarHeight();                usableHeightSansKeyboard -= statusBarHeight;            }            int heightDifference = usableHeightSansKeyboard - usableHeightNow;            if (heightDifference > (usableHeightSansKeyboard/4)) {                // keyboard probably just became visible                frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;            } else {                // keyboard probably just became hidden                frameLayoutParams.height = usableHeightSansKeyboard;            }            mChildOfContent.requestLayout();            usableHeightPrevious = usableHeightNow;        }    }    private int getStatusBarHeight() {        Rect frame = new Rect();        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);        return frame.top;    }    private int computeUsableHeight() {        int statusBarHeight = getStatusBarHeight();        Rect r = new Rect();        mChildOfContent.getWindowVisibleDisplayFrame(r);        //这个判断是为了解决19之后的版本在弹出软键盘时,键盘和推上去的布局(adjustResize)之间有黑色区域的问题        if(VERSION.SDK_INT >= VERSION_CODES.KITKAT){            return (r.bottom - r.top)+statusBarHeight;        }        return (r.bottom - r.top);    }}

 

更多相关文章

  1. android虚拟键盘弹出时挡住EditText的解决方案
  2. 说说 Android(安卓)的 Material Design 设计(二)——滑动菜单
  3. Android日记之性能优化
  4. Android之自定义View的死亡三部曲之(Layout)
  5. Android(安卓)Barrier
  6. Android获取屏幕分辨率及DisplayMetrics简介 和java获得屏幕宽度
  7. 整理一下Android的面试题
  8. Android控件 vs Flutter控件
  9. Android适应方案汇总(三)

随机推荐

  1. Android(安卓)Animation开机动画的优化
  2. android handler.removeCallbacksAndMess
  3. Android控件布局常用属性
  4. android中XLIFF
  5. 编译android版本pjsip
  6. android UI设计之 背景透明色 项目资源文
  7. Android(安卓)五大布局
  8. android 手机管理软件 发布开源代码
  9. [摘]Android如何将程序打成jar包
  10. [Android(安卓)Samples视频系列之ApiDemo