android监听屏幕底部导航栏和输入法的显示

本文介绍了一个用于监听Android设备键盘和底部导航栏显示状态变化的工具类LayoutChangedListener。通过覆盖ViewTreeObserver.OnGlobalLayoutListener的onGlobalLayout方法,可以实现在键盘弹出或底部导航栏显示时触发相应的回调。

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

记录贴,直接上代码!

1、工具类

public class LayoutChangedListener {
    private View decorView = null;
    private int decorViewHeight = 800;  // HD100设备,屏幕的固定高度为800
    private OnLayoutChangeListener layoutChangeListener;

    private Rect rect = new Rect(); // 记录整个屏幕的显示范围

    public LayoutChangedListener(){
    }

    public LayoutChangedListener(Activity mActivity,OnLayoutChangeListener layoutChangeListener){
        decorView = mActivity.getWindow().getDecorView();
        Log.d("lixm","KeyBoardListener(),decorViewHeight = " + decorViewHeight);
        this.layoutChangeListener = layoutChangeListener;
        decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);
    }

    /**
     * 整体布局发生变化时的监听
     */
    private ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            decorView.getWindowVisibleDisplayFrame(rect);
            int curDecorViewHeight = rect.height();// 获取屏幕的高度
            if(decorViewHeight > curDecorViewHeight){
                if((decorViewHeight - curDecorViewHeight) == 48){  // 底部导航栏弹出了
                    if(layoutChangeListener != null){
                        layoutChangeListener.onNavigationBarShow();
                    }
                }else if((decorViewHeight - curDecorViewHeight) == 416){  // 输入法显示
                    if(layoutChangeListener != null){
                        layoutChangeListener.onKeyboardShow();
                    }
                }
            }
            Log.d("lixm","onGlobalLayout(),decorViewHeight = " + decorViewHeight);
        }
    };

    public interface OnLayoutChangeListener{
        public void onKeyboardShow();  // 键盘显示
        public void onNavigationBarShow();  // 底部导航栏显示
    }
}

2、使用(在BaseActivity中使用)

    @Override
    protected void onResume() {
        super.onResume();
        LayoutChangedListener layoutChangedListener = new LayoutChangedListener(this, new LayoutChangedListener.OnLayoutChangeListener() {
            @Override
            public void onKeyboardShow() {
                hideNavigationBar();
            }

            @Override
            public void onNavigationBarShow() {
                hideNavigationBar();
            }
        });
    }

    public void hideNavigationBar(){
        /*隐藏虚拟按键导航栏,底部滑出停留短暂时间*/
        if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
            View v = this.getWindow().getDecorView();
            v.setSystemUiVisibility(View.GONE);
        } else if (Build.VERSION.SDK_INT >= 19) {
            //for new api versions.
            View decorView = getWindow().getDecorView();
            int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN;
            decorView.setSystemUiVisibility(uiOptions);
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值