我以编程方式将包含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
作为视图。
答案 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时,此解决方案可能不起作用。但就我而言,无论如何这都不是一个可预期的情况。