android判斷是否顯示虛擬按鍵及其高度問題

最近要做一個全局輸入框,只能通過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;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章