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