自分の努力...それは私が開発した最善の解決策ではありませんが、とにかく...うまくいきます...
パート 1 : SoftKeyboard が表示されたときに 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 のサイズが変更されたままになります。PopupWindow の方が小さいため、GlobalLayout イベントは発生しません。
パート 2 :偽の PopupWindow を使用して、SoftKeyboard が非表示になっているかどうかを確認します (dirty :()
- 偽の 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;
}
}
});
それは汚い解決策だと確信していますが、それを行う別の方法は見つかりませんでした。