Android獲取底部導(dǎo)航高度菇怀,修復(fù)部分機型檢測到但不顯示問題

Android獲取底部導(dǎo)航部分機型(華為nova凭舶,小米8等)出現(xiàn)了沒有底部導(dǎo)航欄,但是卻檢測到了爱沟,手動給視圖加高度的UI就出現(xiàn)了問題帅霜,下方多了一部分空白,于是查找新的方法呼伸。

檢測導(dǎo)航欄

先看原來使用的方法身冀,Android想要獲取底部虛擬NavigationBar的高度,需要先檢測該手機有無底部導(dǎo)航括享,示例代碼如下:

   /**
     * 檢查是否存在虛擬按鍵欄
     */
    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    private static boolean hasNavBar(Context context) {
        Resources res = context.getResources();
        int resourceId = res.getIdentifier("config_showNavigationBar", "bool", "android");
        if (resourceId != 0) {
            boolean hasNav = res.getBoolean(resourceId);
            String sNavBarOverride = getNavBarOverride();
            if ("1".equals(sNavBarOverride)) {
                hasNav = false;
            } else if ("0".equals(sNavBarOverride)) {
                hasNav = true;
            }
            return hasNav;
        } else {
            return !ViewConfiguration.get(context).hasPermanentMenuKey();
        }
    }

    /**
     * 判斷虛擬按鍵欄是否重寫
     */
    private static String getNavBarOverride() {
        String sNavBarOverride = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            try {
                Class c = Class.forName("android.os.SystemProperties");
                Method m = c.getDeclaredMethod("get", String.class);
                m.setAccessible(true);
                sNavBarOverride = (String) m.invoke(null, "qemu.hw.mainkeys");
            } catch (Exception e) {
                Timber.e(e.toString());
            }
        }
        return sNavBarOverride;
    }
獲取導(dǎo)航高度

如果返回為true才可以獲取底部導(dǎo)航的高度搂根,下邊是獲取底部導(dǎo)航高度的代碼:

    /**
     * 獲取虛擬按鍵的高度
     */
    public static int getNavigationBarHeight(Activity activity) {
        int result = 0;
        if (hasNavBar(activity)) {
            Resources res = activity.getResources();
            int resourceId = res.getIdentifier("navigation_bar_height", "dimen", "android");
            if (resourceId > 0) {
                result = res.getDimensionPixelSize(resourceId);
            }
        }
        Timber.d("NavigationBarHeight = " + result);
        return result;
    }

但是后邊測試過程中出現(xiàn)了問題,有些頁面橫豎屏切換動態(tài)加了這個高度铃辖,在部分手機上出現(xiàn)了剩愧,沒有底部導(dǎo)航,但是檢測到了的情況娇斩,導(dǎo)致整個布局下方出現(xiàn)了白條仁卷,于是開始找如何新的檢測底部導(dǎo)航是否存在的方法。

新方法檢測底部導(dǎo)航是否存在
    private static final String NAVIGATION = "navigationBarBackground";

    // 該方法需要在View完全被繪制出來之后調(diào)用犬第,否則判斷不了
    public static boolean isNavigationBarExist(@NonNull Activity activity) {
        ViewGroup vp = (ViewGroup) activity.getWindow().getDecorView();
        if (vp != null) {
            for (int i = 0; i < vp.getChildCount(); i++) {
                vp.getChildAt(i).getContext().getPackageName();
                if (vp.getChildAt(i).getId() != NO_ID && NAVIGATION.equals(activity.getResources().getResourceEntryName(vp.getChildAt(i).getId()))) {
                    return true;
                }
            }
        }
        return false;
    }

這種方式需要在view加載完成后五督,遍歷所有view,來判斷底部導(dǎo)航是否顯示了瓶殃,比上邊使用getIdentifier獲取的方式更準(zhǔn)確充包,可以適配可以檢測到有,但實際沒有顯示的場景。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末基矮,一起剝皮案震驚了整個濱河市淆储,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌家浇,老刑警劉巖本砰,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钢悲,居然都是意外死亡点额,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門莺琳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來还棱,“玉大人,你說我怎么就攤上這事惭等≌涫郑” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵辞做,是天一觀的道長琳要。 經(jīng)常有香客問我,道長秤茅,這世上最難降的妖魔是什么稚补? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮框喳,結(jié)果婚禮上课幕,老公的妹妹穿的比我還像新娘。我一直安慰自己帖努,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布粪般。 她就那樣靜靜地躺著拼余,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亩歹。 梳的紋絲不亂的頭發(fā)上匙监,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機與錄音小作,去河邊找鬼亭姥。 笑死,一個胖子當(dāng)著我的面吹牛顾稀,可吹牛的內(nèi)容都是我干的达罗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼粮揉!你這毒婦竟也來了巡李?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扶认,失蹤者是張志新(化名)和其女友劉穎侨拦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辐宾,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡狱从,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了叠纹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片季研。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吊洼,靈堂內(nèi)的尸體忽然破棺而出训貌,到底是詐尸還是另有隱情,我是刑警寧澤冒窍,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布递沪,位于F島的核電站,受9級特大地震影響综液,放射性物質(zhì)發(fā)生泄漏款慨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一谬莹、第九天 我趴在偏房一處隱蔽的房頂上張望檩奠。 院中可真熱鬧,春花似錦附帽、人聲如沸埠戳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽整胃。三九已至,卻和暖如春喳钟,著一層夾襖步出監(jiān)牢的瞬間屁使,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工奔则, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛮寂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓易茬,卻偏偏與公主長得像酬蹋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359