最近要做一個全局輸入框,只能通過onGlobalLayout調整適應佈局頂起鍵盤給予正確的高度,遇到國產虛擬按鍵可算是天坑。
問題在於很多隻搜到了是否存在虛擬按鍵,但是隨着全面屏手勢等出現,這個虛擬按鍵是可以動態顯示隱藏的,當隱藏的時候這個判斷方法依然爲true,如果大家知道除了小米之外的官方判斷 歡迎補充
下面我的處理方法。
//diff爲負數的時候說明減去虛擬按鍵的高度 變爲了負數側面證明虛擬按鍵已經隱藏
public static boolean isAbNoHasNavigationBar = false;
public static void addGlobalLayoutListener(final Activity activity) {
final View decorView = activity.getWindow().getDecorView();
final View contentView = activity.findViewById(Window.ID_ANDROID_CONTENT);
final int navigationBarHeight = RomUtils.getNavigationBarHeight(activity);
//小米是否顯示了虛擬按鍵
final boolean isXiaoMIhas = !xiaomiNavigationGestureEnabled(activity);
ViewTreeObserver.OnGlobalLayoutListener listener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
decorView.getWindowVisibleDisplayFrame(r);
int height = getTrueHeight(decorView.getContext());
int diff = height - r.bottom;
//最坑的地方在於很多方法只能判斷是否有虛擬按鍵這個功能,但是無法判斷是否啓用
if (RomUtils.checkIsMiuiRom()) {
if (isXiaoMIhas) {
//顯示虛擬按鍵
diff = diff - navigationBarHeight;
}
} else {
if (isAbNoHasNavigationBar){
//此時在有虛擬鍵的情況下關閉了虛擬鍵
}else {
if(RomUtils.hasSoftKeys(activity.getWindow().getWindowManager()){
diff = diff - navigationBarHeight;
}
}
}
Log.i("rex", "diff:" + diff);
if (diff < 0) {
isAbNoHasNavigationBar = true;
}
if (diff > 0) {
if (contentView.getPaddingBottom() != diff) {
contentView.setPadding(0, 0, 0, diff);
}
} else {
if (contentView.getPaddingBottom() != 0) {
contentView.setPadding(0, 0, 0, 0);
}
}
}
};
decorView.getViewTreeObserver().addOnGlobalLayoutListener(listener);
}
private static final String XIAOMI_FULLSCREEN_GESTURE = "force_fsg_nav_bar";
public static boolean xiaomiNavigationGestureEnabled(Context context) {
int val = Settings.Global.getInt(context.getContentResolver(), XIAOMI_FULLSCREEN_GESTURE, 0);
return val != 0;
}