han*_*ang 13 android android-softkeyboard
我使用TYPE_APPLICATION_PANEL在软键盘上面添加WindowManager视图,但它在某些手机上不起作用,也不适用于TYPE_SYSTEM_ALERT.我应该怎么做才能在所有手机上实现?
是的,这可以通过软键盘上的PopupWindow来完成.

他们在键盘上添加了自定义视图.您只需按照其实施模式轻松添加视图即可.我还想强调一些重要的代码,
最初定义键盘高度,
// Defining default height of keyboard which is equal to 230 dip
final float popUpheight = getResources().getDimension(
R.dimen.keyboard_height);
changeKeyboardHeight((int) popUpheight);
Run Code Online (Sandbox Code Playgroud)
此方法用于动态检查键盘高度及其可见性,
/**
* 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;
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
并且此方法根据实际键盘高度更改表情符号键盘高度,
/**
* 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);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经按照这种方法得到了我想要的.我相信您可以根据应用的要求实施此功能.
希望能帮助到你.
TYPE_SYSTEM_ALERT窗口在某些设备上根本不起作用,但如果它们起作用,则应将其放置在 IME 窗口上方。我建议你尝试一下TYPE_TOASTwindows。Toast 适用于所有设备,并显示在键盘上方。但在某些 Android 版本(例如 4.1)上,Toast 不接受用户输入,例如触摸或按键事件。
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 前面,但该窗口将无法聚焦。
| 归档时间: |
|
| 查看次数: |
655 次 |
| 最近记录: |