锚定的PopupWindow和SOFT_INPUT_ADJUST_RESIZE android

4

我有一个以按钮为锚点(置于顶部)的 PopupWindow,其中包含一个 ScrollView。

PopupWindow 以 SOFT_INPUT_ADJUST_RESIZE 模式显示,并带有偏移量。

代码:

    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
    window.showAtLocation(parent, Gravity.NO_GRAVITY, xPos, yPos);

屏幕:

基础屏幕 http://imageshack.us/a/img38/7771/basescreen.png

当软键盘出现时,我有这个(顶部按钮被隐藏):

现有屏幕 http://imageshack.us/a/img21/6396/whatihavescreen.png

我想要的是:

PopupWindow被锚定在按钮上并进行了调整大小。

期望屏幕 http://imageshack.us/a/img805/3302/whatiwantscreen.png

提前感谢!


有什么可能的解决方案? - Dory
2个回答

0

自己努力...这不是我开发的最好的解决方案,但无论如何...它能够工作...

第一部分:当软键盘出现时调整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) {
                // 键盘可见
                window.update( - 1, baseHeight - diff - yPos);
                resized = true;
            }
        }
    });
    

当您完成此操作后,即使软键盘隐藏,PopupWindow仍保持调整大小状态。由于PopupWindow较小,因此不会触发GlobalLayout事件。

第二部分:使用虚假的PopupWindow来确定SoftKeyboard是否隐藏(有点不太好:())

  • 使用真实的 PopupWindow 高度来构建虚假的 PopupWindow
  • 不要忘记在真实的 PopupWindow 关闭时一并关闭虚假的 PopupWindow
  • 在真实的 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);
    
  • 在虚假的 PopupWindow 上注册 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;
            }
        }
    });
    

我很确定这是一个不太好的解决方案,但我没有找到其他方法来做到这一点。


0
就像我说的那样,有一个更简单的解决方案:showAsDropDown。当软键盘出现时,这种方法可以完成任务...
showAtLocation相比,唯一需要改变的是xoff和yoff的计算。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接