Android 软件盘的处理方式

本文介绍了一款针对Android应用的软键盘适配工具类,该工具类能自动调整Activity布局,解决软键盘弹出时界面错位的问题,特别适用于华为、小米等设备。通过监听布局变化,自动调整界面高度,确保用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

废话不多说直接上工具类 里面注释也很清楚
(调用方法直接子activity’的绑定监听器的地方调用就好 )

public class SoftHideKeyBoardUtil {
    public static void assistActivity(Activity content, boolean isAllWindow) {
        new SoftHideKeyBoardUtil(content,isAllWindow);
    }

private View mChildOfContent;

private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;
//为适应华为小米等手机键盘上方出现黑条或不适配
private int contentHeight;//获取setContentView本来view的高度
private boolean isfirst = true;//只用获取一次
private int statusBarHeight;//状态栏高度

private SoftHideKeyBoardUtil(Activity activity, final boolean isAllWindow) {
    //1、找到Activity的最外层布局控件,它其实是一个DecorView,它所用的控件就是FrameLayout
    FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
    //2、获取到setContentView放进去的View
    mChildOfContent = content.getChildAt(0);
    //3、给Activity的xml布局设置View树监听,当布局有变化,如键盘弹出或收起时,都会回调此监听
    mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        //4、软键盘弹起会使GlobalLayout发生变化
        public void onGlobalLayout() {
            if (isfirst) {
                contentHeight = mChildOfContent.getHeight();
                //兼容华为等机型
                isfirst = false;
            }
            //5、当前布局发生变化时,对Activity的xml布局进行重绘
            possiblyResizeChildOfContent(isAllWindow);
        }
    });
    //6、获取到Activity的xml布局的放置参数
    frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
}

// 获取界面可用高度,如果软键盘弹起后,Activity的xml布局可用高度需要减去键盘高度
private void possiblyResizeChildOfContent(boolean isAllWindow) {
    //1、获取当前界面可用高度,键盘弹起后,当前界面可用布局会减少键盘的高度
    int usableHeightNow = computeUsableHeight(isAllWindow);
    //2、如果当前可用高度和原始值不一样
    if (usableHeightNow != usableHeightPrevious) {
        //3、获取Activity中xml中布局在当前界面显示的高度
        int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
        //4、Activity中xml布局的高度-当前可用高度
        int heightDifference = usableHeightSansKeyboard - usableHeightNow;
        //5、高度差大于屏幕1/4时,说明键盘弹出
        if (heightDifference > (usableHeightSansKeyboard / 4)) {
            // 6、键盘弹出了,Activity的xml布局高度应当减去键盘高度
            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(boolean isAllWindow) {
    Rect r = new Rect();
    mChildOfContent.getWindowVisibleDisplayFrame(r);
    // 全屏模式下:直接返回r.bottom,r.top其实是状态栏的高度
    if (isAllWindow) {
        return (r.bottom );
    }else {
        return (r.bottom - r.top);
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值