Android 輸入法佈局改變的頁面適配

需求

  1. 點擊評論輸入彈出軟鍵盤
  2. 點擊評論區的Emoji按鈕,切換至Emoji輸入
  3. 點擊評論區的圖片按鈕,插入圖片

難點

  1. 切換輸入法的時候,自動調整Emoji和圖片區域適應鍵盤高度。
  2. 當切換至全屏手寫,半屏手寫時,軟鍵盤高度變化。若軟鍵盤高度變大,輸入框會上移;若軟鍵盤高度減少,輸入框不會下移。手動調整輸入框位置,發現輸入框的佈局位置已固定,下移會導致輸入框不可見,不能解決該問題。最後的解決方案是,手動關閉軟鍵盤,延時10ms再彈出,強制系統重新調整佈局。

方案

  1. 點擊評論輸入彈出軟鍵盤
    EditText的TouchListeer
  2. 點擊評論區的Emoji按鈕,切換至Emoji輸入
    onClickListener
  3. 點擊評論區的圖片按鈕,插入圖片
    onClickListener
  4. 切換輸入法的時候,自動調整Emoji和圖片區域適應鍵盤高度。
    EditText的getViewTreeObserver().addOnGlobalLayoutListener
        listener = new ViewTreeObserver.OnGlobalLayoutListener() {

            @Override
            public void onGlobalLayout() {

                if (getActivity() != null) {
                    int keyboardHeight = getKeyboardHeight(rootView);
                    mIsKeyboardShown = (keyboardHeight > 0);

                    switch (mInputMode) {
                        //彈出軟鍵盤
                        case IM_KEYBOARD_SHOWN:
                            if (keyboardHeight > 0) {
                                if (mKeyboardHeight != keyboardHeight) {
                                    mKeyboardHeight = keyboardHeight;
                                    //調整佈局高度
                                }
                                mInputMode = IM_KEYBOARD_INPUT;
                            }
                            break;
                        //軟件盤已彈出
                        case IM_KEYBOARD_INPUT:
                            if (keyboardHeight == 0) {
                                hideInputView(holder, false);
                            } else if (keyboardHeight > 0) {
                                if (mKeyboardHeight != keyboardHeight) {
                                    if (mKeyboardHeight > keyboardHeight) {
                                       //強制關閉軟鍵盤
                                  getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
                                       //延時,強制顯示軟鍵盤
                                                                     inputManager.hideSoftInputFromWindow(holder.editor.getWindowToken(), 0);
                                        holder.editor.postDelayed(new Runnable() {

                                            @Override
                                            public void run() {
                                                getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
                                                inputManager.showSoftInput(holder.editor, InputMethodManager.SHOW_FORCED);
                                            }
                                        }, 10);
                                    }
                                    mKeyboardHeight = keyboardHeight;
                                    //調整佈局高度
                                }
                            }
                            break;
                    }

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