android 輸入法彈出時不能擋住按鈕把佈局頂上去
阿新 • • 發佈:2019-01-24
最近在做註冊登入介面,刷刷刷的做完了,也已經上線了。突然有一天產品拿著手機跑到我這裡說,這個註冊介面使用者體驗太差了,每次輸入完一行資訊後,都要把輸入法收回去,然後再輸入下一行,甚至把註冊的按鈕給擋住了。心想之前我做的基本都是這樣的,不會特意去處理這個,看來這次必須得解決了。網上也找了很多的資料,很多都是講在AndroidManifest中去修改windowSoftInputMode 這個屬性,但是這個還是解決不了輸入法擋住按鈕的問題,不是很完美。有些文章說要把佈局弄成線性佈局,然後使用layout_weight設定權重,雖然有效,但不能適用於各種佈局的情況。在經過了一個下午的摸索,網上查詢資料後,終於實現了自己想要的效果,登入/註冊按鈕都在輸入法的上面了。
思路:我們可以監聽輸入法的輸入,當輸入法開啟的時候,我們就把要移動的佈局通過屬性動畫往上移動,當輸入法收回去的時候再把要移動的佈局往下移回去。
//根佈局 bind.mRlContainer.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); bind.mRlContainer.getWindowVisibleDisplayFrame(r); if (sc == null) { sc = new int[2]; bind.mLlLogin.getLocationOnScreen(sc); } //r.top 是狀態列高度 int screenHeight = bind.mRlContainer.getRootView().getHeight(); int softHeight = screenHeight - r.bottom; if (scrollHegit == 0&&softHeight>120) scrollHegit = sc[1] +bind.mLlLogin.getHeight() -(screenHeight-softHeight);//可以加個5dp的距離這樣,按鈕不會挨著輸入法 if (softHeight > 120) {//當輸入法高度大於100判定為輸入法打開了 設定大點,有虛擬鍵的會超過100 if (bind.mRlContainer.getScrollY() != scrollHegit) scrollToPos(0, scrollHegit); } else {//否則判斷為輸入法隱藏了 if (bind.mRlContainer.getScrollY() != 0) scrollToPos(scrollHegit, 0); } } });
修改之前的private void scrollToPos(int start, int end) { ValueAnimator animator = ValueAnimator.ofInt(start, end); animator.setDuration(250); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { bind.mRlContainer.scrollTo(0, (Integer) valueAnimator.getAnimatedValue()); } }); animator.start(); }