好久沒(méi)碼字了,所以出來(lái)冒個(gè)泡
一直用著華為的手機(jī),從一開(kāi)始就覺(jué)得華為的虛擬導(dǎo)航欄用著還是挺順手的,后來(lái)發(fā)現(xiàn)越來(lái)越多的機(jī)子都開(kāi)始使用起來(lái),查看源碼發(fā)現(xiàn),虛擬導(dǎo)航欄是屬于SystemUI的一部分。
再一看手機(jī),還提供了隱藏虛擬按鍵的按鈕,于是就想,能不能有一個(gè)方法判斷導(dǎo)航欄是否顯示?基于不重復(fù)造輪子的思想,先是網(wǎng)上搜索了一把,方法都大同小異,但一用,發(fā)現(xiàn)挺多新手機(jī)都無(wú)法適配,于是從另一種方向思考如何判斷NavigationBar虛擬導(dǎo)航欄是否顯示?
思考:從DecorView這個(gè)神View入手,因?yàn)榭紤]到我們碼的代碼基本都在DecorView中一個(gè)id為android.R.id.content的容器中,那好,就根據(jù)content的容器寬高判斷虛擬導(dǎo)航欄是否顯示,于是就有了下面的代碼。
package com.lkuan.gek.util;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Point;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.view.Display;
import android.view.View;
import android.view.Window;
/**
* @author lkuan
* Create on 2018/5/25
*/
public class NavigationBarUtil {
/**
* 判斷虛擬導(dǎo)航欄是否顯示
*
* @param context 上下文對(duì)象
* @param window 當(dāng)前窗口
* @return true(顯示虛擬導(dǎo)航欄),false(不顯示或不支持虛擬導(dǎo)航欄)
*/
public static boolean checkNavigationBarShow(@NonNull Context context, @NonNull Window window) {
boolean show;
Display display = window.getWindowManager().getDefaultDisplay();
Point point = new Point();
display.getRealSize(point);
View decorView = window.getDecorView();
Configuration conf = context.getResources().getConfiguration();
if (Configuration.ORIENTATION_LANDSCAPE == conf.orientation) {
View contentView = decorView.findViewById(android.R.id.content);
show = (point.x != contentView.getWidth());
} else {
Rect rect = new Rect();
decorView.getWindowVisibleDisplayFrame(rect);
show = (rect.bottom != point.y);
}
return show;
}
}
經(jīng)測(cè)試,手上大部分手機(jī)都能正確得到結(jié)果,支持無(wú)虛擬按鍵的判斷。
手機(jī)碼字挺不容易的
附上一個(gè)民咕嚕的表情包娛樂(lè)一下_

圖片發(fā)自簡(jiǎn)書App