1. 程式人生 > >android 輸入法彈出時不能擋住按鈕把佈局頂上去

android 輸入法彈出時不能擋住按鈕把佈局頂上去

最近在做註冊登入介面,刷刷刷的做完了,也已經上線了。突然有一天產品拿著手機跑到我這裡說,這個註冊介面使用者體驗太差了,每次輸入完一行資訊後,都要把輸入法收回去,然後再輸入下一行,甚至把註冊的按鈕給擋住了。心想之前我做的基本都是這樣的,不會特意去處理這個,看來這次必須得解決了。網上也找了很多的資料,很多都是講在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();
    }
修改之前的