Android 监听NavigationBar

1、闲聊

        先说说我这儿为什么要监听NavigationBar它吧,是这么个事儿,我发现我的PopupWindow在,华为手机及其他有底部虚拟按键的手机上会被,该手机自带的虚拟按键 遮挡 或者留出 空白 ,那么我想怎么办呢?要不通过反射去取出NavigationBar吧?但是不是每个手机都有的!这儿我就一直想啊一直想怎么通过NavigationBar来监听!最后我发现的走入了一个误区!什么呢?我看了一下我原先改状态栏颜色是的代码:

android.support.v7.widget.ViewStubCompat{4a7e920c G.E..... ......I. 0,0-0,0 #7f0e0083 app:id/action_mode_bar_stub}

android.support.v7.widget.ContentFrameLayout{4a7f4c84 V.ED.... ......I. 0,0-0,0 #1020002 android:id/content}

        就是整个屏幕大体就分为两个部分:系统和我们可操作的页面部分。到了这里就好做啊!我可以直接监听 内容(AndroidContent)部分的边界值改变啊!好了不逼逼了,上代码吧。

2、代码

        获取内容部分并设置边界改变监听:

View androidContent = findViewById(Window.ID_ANDROID_CONTENT);
androidContent.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom,
                               int oldLeft, int oldTop, int oldRight, int oldBottom) {
        Log.d(TAG, "onLayoutChange: " + v.getHeight());
        //在这里写改变后的操作
    }
});

这里写图片描述

这里写图片描述

        大家可以放心使用这个方法,可以看到这个方法是在Andorid api 11 的时候引入的,在如今基于Android 4.4.2 开发的时代,完全没有任何问题!
最后我再提供两个方法来判断NavigationBar的显示隐藏:

/**
 * 获取当前屏幕高度(px)
 *
 * @param context
 * @return 当前屏幕高度(px)
 */
public static int getScreenHeight(Context context) {
    return context.getResources().getDisplayMetrics().heightPixels;
}

/**
 * 获取设备的状态栏高度(px)
 *
 * @param context
 * @return 设备的状态栏高度(px)
 */
public static int getScreenStatusBarHeight(Context context) {
    //获取status_bar_height资源的ID
    int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        //根据资源ID获取响应的尺寸值
        return context.getResources().getDimensionPixelSize(resourceId);
    }
    return -1;
}

        判断:

View androidContent = findViewById(Window.ID_ANDROID_CONTENT);
androidContent.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom,
                               int oldLeft, int oldTop, int oldRight, int oldBottom) {
        Log.d(TAG, "onLayoutChange: " + v.getHeight());
        if (getScreenHeight(context) 
                - getScreenStatusBarHeight(context) == v.getHeight()) {
            //这写NavigationBar隐藏时的操作
        } else {
            //这儿写NavigationBar显示时的操作
        }
    }
});

        这个方法应该算比较完美的了!有问题及时交流!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android navigationbar 是指在 Android 系统中的导航栏。导航栏通常位于屏幕底部,用于提供用户导航和操作功能。它包含了一些常见的导航按钮,如返回、主页、多任务切换等。Android navigationbar 可以自定义其外观和行为,以适应不同设备和系统版本的需求。通过修改 NavigationBarFragment 的布局文件,可以对导航栏进行定制和扩展。 这样的导航栏在 Android SystemUI 中起着重要的作用,它提供了用户与系统交互的入口,并提供了快速访问常用功能和应用的方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Android SystemUI之NavigationBar,导航栏(四)](https://blog.csdn.net/Bill_xiao/article/details/108517403)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Android NavigationBar问题处理的方法](https://download.csdn.net/download/weixin_38608379/12770828)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值