Android EditText被軟鍵盤遮蓋的處理方法

轉自  點擊打開鏈接

android app新增了透明欄效果,結果發現鍵盤彈起後會遮蓋屏幕底部的EditText,沒有像想象中的調整窗口大小,並滾動ScrollView,將EditText顯示在鍵盤上方。下面小編把解決方法記錄一下,特此分享到腳本之家平臺,感興趣的朋友一起看看吧

這兩天android app新增了透明欄效果,結果發現鍵盤彈起後會遮蓋屏幕底部的EditText,沒有像想象中的調整窗口大小,並滾動ScrollView,將EditText顯示在鍵盤上方。之前也遇到過類似問題,所以解決後就乾脆寫把所有關於EditText和鍵盤之間問題和解決思路都記錄一下,以便以後查閱。

  一、在5.0以前,如果EditText設置了gravity=“center|right”其中之一且同時設置了singleLine=“true”,就會導致屏幕底部的EditText連續點擊彈出鍵盤時,從第二次開會一直遮擋住EditText。

  5.0+則不會有該問題,解決辦法也簡單,在EditText外層包裹ScrollView,並設置鍵盤模式爲adjustResize模式即可(兩者缺一不可)。

  二、按上面描述的解決辦法,一直沒什麼問題,直到最近加了透明欄效果,鍵盤模式彷彿直接失效,每次點擊底部EditText時,鍵盤都從底部彈起,窗口大小也不會調整,底部EditText也會被遮蓋。最後發現是當使用getWindow().getDecorView().setSystemUiVisibility方法設置了SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN或SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION ,或者設置了 window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)時,會引發EditText被鍵盤遮蓋問題。

  因爲透明欄效果是從4.4開始支持,也就導致從4.4開始項目就存在這個BUG,當然只考慮5.0+的透明欄效果,可以直接設置狀態欄顏色實現透明欄效果,我這裏由於項目需要必須要從4.4開始支持,所以必須解決這個問題。

  正常情況下,系統UI會佔用app一些空間,例如狀態欄、鍵盤、導航欄等,也就是說我們的app UI不會出現在系統UI之下,但從測試結果來看,爲了佔用狀態欄空間或全屏,設置了上面的一些屬性後,就會被系統UI覆蓋。

  解決方法:

監聽界面容器的layout變化,當發生變化時,通過檢查窗口可見區域高度,判斷鍵盤是否彈起,如果彈起,則修改容器bottom padding,也就是手動實現adjustResize效果,給鍵盤留出顯示空間,這樣ScrollView也會自動調整大小,將EditText顯示在鍵盤上方。

public class KeyboardPatch {
    private Activity activity;
    private View decorView;
    private View contentView;

    /**
     * 構造函數
     *
     * @param act         需要解決bug的activity
     * @param contentView 界面容器,activity中一般是R.id.content,也可能是Fragment的容器,根據個人需要傳遞
     */
    public KeyboardPatch(Activity act, View contentView) {
        this.activity = act;
        this.decorView = act.getWindow().getDecorView();
        this.contentView = contentView;
    }

    /**
     * 監聽layout變化
     */
    public void enable() {
        activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        if (Build.VERSION.SDK_INT >= 19) {
            decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);
        }
    }

    /**
     * 取消監聽
     */
    public void disable() {
        activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
        if (Build.VERSION.SDK_INT >= 19) {
            decorView.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener);
        }
    }

    private ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Rect r = new Rect();
            decorView.getWindowVisibleDisplayFrame(r);
            int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels;
            int diff = height - r.bottom;
            Log.e("簡距",diff+"");
            if (diff != 0) {// 鍵盤彈出
                if (contentView.getPaddingBottom() != diff) {
                    contentView.setPadding(0, 0, 0, diff);
                }
            } else {
                if (contentView.getPaddingBottom() != 0) {
                    contentView.setPadding(0, 0, 0, 0);
                }
            }
        }
    };
}

?

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