需求
- 點擊評論輸入彈出軟鍵盤
- 點擊評論區的Emoji按鈕,切換至Emoji輸入
- 點擊評論區的圖片按鈕,插入圖片
難點
- 切換輸入法的時候,自動調整Emoji和圖片區域適應鍵盤高度。
- 當切換至全屏手寫,半屏手寫時,軟鍵盤高度變化。若軟鍵盤高度變大,輸入框會上移;若軟鍵盤高度減少,輸入框不會下移。手動調整輸入框位置,發現輸入框的佈局位置已固定,下移會導致輸入框不可見,不能解決該問題。最後的解決方案是,手動關閉軟鍵盤,延時10ms再彈出,強制系統重新調整佈局。
方案
- 點擊評論輸入彈出軟鍵盤
EditText的TouchListeer
- 點擊評論區的Emoji按鈕,切換至Emoji輸入
onClickListener
- 點擊評論區的圖片按鈕,插入圖片
onClickListener
- 切換輸入法的時候,自動調整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;
}
};