1. 程式人生 > >Android隱藏底部導航欄三大金剛按鈕

Android隱藏底部導航欄三大金剛按鈕

 注:非uid.system專案不用看了。。。。避免看完嘗試不行,233333

    定製化專案難免會用到這種需求,要就隱藏底部導航欄,讓使用者不能點選,底部導航欄的3大金剛分別就是我們看到的-返回鍵、home鍵、recent鍵。返回鍵對於我們來說很簡單,平時總是要監聽重寫返回鍵按鈕的方法,home鍵你可以類似重寫返回鍵一樣,但是無法達到你想要的效果。如下圖:

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了(不許吐槽排版,什麼排版不排版的,主要是我喜歡凌亂美~)。。。我們下期見,(我也不知道下期是何期),哈哈

今夕是何夕,晚風過花庭~~~~