【问题标题】:anchored PopupWindow and SOFT_INPUT_ADJUST_RESIZE android锚定 PopupWindow 和 SOFT_INPUT_ADJUST_RESIZE android
【发布时间】:2012-11-27 11:41:20
【问题描述】:

我有一个 PopupWindow 锚定在 Button(顶部)上。 PopupWindow 包含一个 ScrollView。 PopupWindow 处于 SOFT_INPUT_ADJUST_RESIZE 模式并使用偏移量定位

代码:

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

屏幕:

base screen http://imageshack.us/a/img38/7771/basescreen.png

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

what i have screen http://imageshack.us/a/img21/6396/whatihavescreen.png

我想拥有:

PopupWindow 锚定在 Button 上并调整大小。

what i have screen http://imageshack.us/a/img805/3302/whatiwantscreen.png

提前致谢!

【问题讨论】:

  • 有什么可能的解决方案

标签: android popupwindow


【解决方案1】:

自己的努力... 这不是我开发的最佳解决方案,但无论如何......它有效......

第 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);
    
  • 在fake上注册一个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;
            }
        }
    });
    

我很确定这是一个肮脏的解决方案,但我没有找到其他方法。

【讨论】:

    【解决方案2】:

    就像我说的,有一个更简单的解决方案:showAsDropDown。 当软键盘出现时,此方法就可以完成工作...

    与showAtLocation 相比,唯一改变的是 xoff 和 yoff 计算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多