键盘打开时移动居中的PopupView

时间:2016-01-06 15:06:52

标签: android android-layout

我以编程方式将包含PopupView字段的EditText添加到我的活动中,该活动在屏幕上垂直和水平居中。当键盘打开时,我希望PopupView向上移动,因此它仍然位于可见屏幕/活动部分的中心位置。

我的代码:

EditText e = new EditText(super.getContext());

PopupWindow popup = new PopupWindow(e, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
popup.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
popup.setOutsideTouchable(true);
popup.setFocusable(true);
popup.showAtLocation(this, Gravity.CENTER, 0, 0);

我已为活动windowSoftInputMode尝试了很多内容;我试图在弹出窗口setSoftInputMode(mode) - 但我的方法都没有奏效。当键盘打开时,我的布局和弹出窗口都不会改变它们的位置。 (我只想要我的弹出窗口但不想改变布局,只是指出它。)

此外,代码也会放在LinearLayout课程中,以防您想知道为什么我使用this作为视图。

2 个答案:

答案 0 :(得分:1)

更容易让Android为您完成所有繁重的工作。

只需使用:

popup.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

答案 1 :(得分:0)

经过大量研究,我终于找到了实现这一目标的方法。

创建PopupWindow并使其在垂直和水平中心显示的代码保持不变:

PopupWindow popup = new PopupWindow(
         popupView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
/** ... **/
popup.showAtLocation(this, Gravity.CENTER, 0, 0);

然后你唯一需要的是键盘的监听器(或更一般的:对于窗口高度的改变)。这实际上比我想象的要容易 - 并且它不需要像Activity对象或类似的任何特殊访问。即使在我只知道Context(我不想投)的独立View类中,我也能够实现这一目标。您需要的只是一个View - 已添加到布局中的对象。

// You can call this method on any view that is added to the layout:
final View root = this.getRootView();
root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    public void onGlobalLayout() {
        Rect r = new Rect();
        root.getWindowVisibleDisplayFrame(r);

        // Calculate the difference between the original height and the new height
        int heightDiff = r.height() - root.getHeight();

        // Now update the Popup's position
        // The first value is the x-axis, which stays the same.
        // Second value is the y-axis. We still want it centered, so move it up by 50% of the height
        // change
        // The third and the fourth values are default values to keep the width/height
        popup.update(0, heightDiff / 2, -1, -1);
    }
});

供参考: Listening to window height changes

唯一的缺点:
在键盘已打开时添加PopupView时,此解决方案可能不起作用。但就我而言,无论如何这都不是一个可预期的情况。