我使用TYPE_APPLICATION_PANEL在软键盘上面添加一个WindowManager视图,但它不能在某些手机上工作,也不适用于TYPE_SYSTEM_ALERT。我该怎么做才能在所有手机上实现?
答案 0 :(得分:6)
是的,这可以通过软键盘上的PopupWindow来完成。
您可以查看this库或this库,它们已经完全按照您的要求进行了实施。
他们在键盘上添加了自定义视图。您只需按照其实施模式轻松添加视图即可。 我还想强调一些重要的代码,
最初定义键盘高度,
// Defining default height of keyboard which is equal to 230 dip
final float popUpheight = getResources().getDimension(
R.dimen.keyboard_height);
changeKeyboardHeight((int) popUpheight);
此方法用于动态检查键盘高度及其可见性,
/**
* Checking keyboard height and keyboard visibility
*/
int previousHeightDiffrence = 0;
private void checkKeyboardHeight(final View parentLayout) {
parentLayout.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
parentLayout.getWindowVisibleDisplayFrame(r);
int screenHeight = parentLayout.getRootView()
.getHeight();
int heightDifference = screenHeight - (r.bottom);
if (previousHeightDiffrence - heightDifference > 50) {
popupWindow.dismiss();
}
previousHeightDiffrence = heightDifference;
if (heightDifference > 100) {
isKeyBoardVisible = true;
changeKeyboardHeight(heightDifference);
} else {
isKeyBoardVisible = false;
}
}
});
}
此方法根据实际键盘高度
更改表情符号键盘高度/**
* change height of emoticons keyboard according to height of actual
* keyboard
*
* @param height
* minimum height by which we can make sure actual keyboard is
* open or not
*/
private void changeKeyboardHeight(int height) {
if (height > 100) {
keyboardHeight = height;
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, keyboardHeight);
emoticonsCover.setLayoutParams(params);
}
}
我遵循了这种方法,并且完全符合我的要求。我相信您可以根据应用的要求实施此功能。
希望它有所帮助。
答案 1 :(得分:1)
TYPE_SYSTEM_ALERT
窗口根本无法在某些设备上运行,但如果它们工作,则应将它们放在IME窗口上方。我建议你试试TYPE_TOAST
个窗口。 Toasts可在所有设备上运行,并显示在键盘上方。但是在4.1版Toast等Android版本中,不接受用户输入,如触摸或键事件。
TYPE_PHONE
也可能是解决问题的好方法,但我认为它不适用于TYPE_SYSTEM_ALERT
无效的设备。
更新:您可以尝试的另一件事是将WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
添加到WindowManager.LayoutParams.flags
。这个标志告诉Android定位一个窗口,以便它可以覆盖IME。在这种情况下,必须取消设置WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
标志。在此配置中,窗口将是可聚焦的,应位于IME前面。
另一种选择是仅设置WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
标志并设置WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
标志。它还会使您的窗口位于IME前面,但窗口将无法调焦。