自己的努力......这不是我开发的最佳解决方案,但无论如何......它有效......
第 1 部分:当软键盘出现时调整 PopupWindow 的大小
在内容视图上使用 OnGlobalLayoutListener
contentView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
int baseHeight = 0;
@Override
public void onGlobalLayout() {
if(resized) {
return;
}
if(baseHeight <= 0) {
baseHeight = contentView.getHeight();
return;
}
final int diff = baseHeight - contentView.getHeight();
if(diff > 0) {
// keyboard is visible
window.update( - 1, baseHeight - diff - yPos);
resized = true;
}
}
});
完成此操作后,即使 SoftKeyboard 隐藏,PopupWindow 也会保持调整大小。GlobalLayout 事件不会被触发,因为 PopupWindow 较小。
第 2 部分:使用假的 PopupWindow 来了解 SoftKeyboard 是否隐藏(脏 :()
- 用真实的 PopupWindow 高度构建假的 PopupWindow
- 当真人被解雇时,不要忘记解雇假人
在真品之前展示假货
buildFakePopupWindow(rootHeight);
window.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss() {
if(fakeWindow != null) {
fakeWindow.dismiss();
}
}
});
fakeWindow.showAtLocation(parent, Gravity.NO_GRAVITY, xPos, yPos);
在假的上注册一个 GlobalLayoutListener
final View fakeContentView = fakeWindow.getContentView();
fakeContentView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
int baseHeight = 0;
@Override
public void onGlobalLayout() {
if(baseHeight <= 0) {
baseHeight = fakeContentView.getHeight();
return;
}
final int diff = baseHeight - fakeContentView.getHeight();
if(diff <= 0 && resized) {
window.update( - 1, WindowManager.LayoutParams.WRAP_CONTENT);
resized = false;
}
}
});
我很确定这是一个肮脏的解决方案,但我没有找到另一种方法。