Android隐藏底部导航栏三大金刚按钮

 注:非uid.system项目不用看了。。。。避免看完尝试不行,233333

    定制化项目难免会用到这种需求,要就隐藏底部导航栏,让用户不能点击,底部导航栏的3大金刚分别就是我们看到的-返回键、home键、recent键。返回键对于我们来说很简单,平时总是要监听重写返回键按钮的方法,home键你可以类似重写返回键一样,但是无法达到你想要的效果。如下图:

    原文:https://mp.weixin.qq.com/s?__biz=MzI4MjgxMjMwNQ==&mid=2247483668&idx=1&sn=a0325c2b9d472666df064a75b5747eca&chksm=eb950beadce282fcd75721c2aeb29b8d45ecb7ad8784745614e4d8bc97d2e2f512180cae61c3&token=1198630132&lang=zh_CN#rd

public boolean onKeyDown(int keyCode,KeyEvent event) {
    int key = event.getKeyCode();
    switch (key) {
        case KeyEvent.KEYCODE_BACK:
            return true;
        case KeyEvent.KEYCODE_MENU://recent
            return true;
        case KeyEvent.KEYCODE_HOME://home
            return true;
        default:
            break;
    }
    return super.onKeyDown(keyCode,event);
}

    如果这么简单,今天就不用写这篇文章了。。home键根本拦截不了,但是拦截不了也是有办法的,曲线救国是最好的办法,我们可以注册广播监听home键的按钮,当摁下home键接受到广播,然后操作你想做的事达到拦截的效果,其实这种方法也不太好,有时候用户手抽筋点的很快,你这个就视觉效果达不到视力正常的人想要的了。广播也贴一些:

innerReceiver = new HomeReceiver();

IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);

registerReceiver(innerReceiver, intentFilter);
static public final String SYSTEM_DIALOG_REASON_KEY = "reason";
static public final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
static public final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    //按下Home键会发送ACTION_CLOSE_SYSTEM_DIALOGS的广播
    if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
        String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
        if (reason != null) {
            if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY) || reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
                Log.d("ddd","按了home");
                你可以为所欲为了。。。
                }
            }
        }
    }
}

当然,今天也不是来讲这个的,要不然实在对不起取得标题。吃瓜群众内心os:标题党什么的最可爱了~~~

好了大家准备好安全措施,我要发飙了~发车了。。

在framework里面Android有一个

android.app.StatusBarManager

 

我们通过获取ststusBarManager来管理这几个按钮,但是这些方法肯定在底层是@hide的,通过——反射获取;

    

private void setStatusBarDisable(int disable_status) {//调用statusBar的disable方法
    @SuppressLint("WrongConstant") Object service = getSystemService("statusbar");
    try {
        Class<?> statusBarManager = Class.forName("android.app.StatusBarManager");
        Method expand = statusBarManager.getMethod("disable", int.class);
        expand.invoke(service, disable_status);
    } catch (Exception e) {
        unBanStatusBar();
        e.printStackTrace();
    }
}

    我们通过反射获取manager下面的disable方法,这个方法是是不是很吊,直接能隐藏3大金刚。。。传入一个int的值,就是你需要隐藏的按钮和事件,

public static final int DISABLE_EXPAND = 0x00010000;//4.2以上的整形标识
public static final int DISABLE_EXPAND_LOW = 0x00000001;//4.2以下的整形标识
public static final int DISABLE_NONE = 0x00000000;//取消StatusBar所有disable属性,即还原到最最原始状态

public static final int DISABLE_HOME = 0x00200000; //二进制的值是0x00200000
public static final int DISABLE_RECENT = 0x01000000; //二进制的值是 0x01000000
public static final int DISABLE_BACK = 0x00400000; //二进制的值是 0x00400000

    这些二进制都是底层对应按钮的值,当然,我必须说明一点,Android各个版本都会做出相应改变,每个版本的值可能或许会有不同,注意防范。。

好了现在就很简单了,分别调用隐藏方法,然后分别传入对应的二进制值,大功告成。。。。。

    有没有心急的人发现还是没有实现隐藏home键,(:哼哼,其实到这里还是不能直接传入二进制值达到目的,分别调用是无法实现隐藏所有按钮的,必须!一定!绝对!要用下面的方式正确打开:

int flag = DISABLE_HOME | DISABLE_RECENT | DISABLE_BACK | DISABLE_EXPAND;

上面的值,看你需要哪些,不一定要全部(应该不用我提示了吧)!!!

最后记得,取消这个隐藏的状态,就是传入DISABLE_NONE;好了,今天的就讲到这里的,时间有限,毕竟是上班时间写的,,,,,,,(老板看到会不会打我)。在7.0上有效,8.0因为我刷机的系统出现问题,我又懒,就没去测试了。。效果:

ok了(不许吐槽排版,什么排版不排版的,主要是我喜欢凌乱美~)。。。我们下期见,(我也不知道下期是何期),哈哈

今夕是何夕,晚风过花庭~~~~

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值