需求
- 点击评论输入弹出软键盘
- 点击评论区的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;
}
};