在对话框显示时显示弹出窗口

4
前提:使用“在顶部”一词时,我指的是“叠加”,具有“更高的z-index”,可以说;使用“以上”一词时,我指的是“视觉上在屏幕上方”。
我想问题应该是“如何在对话框显示时在键盘上方显示PopupWindow?”。接下来是情况...
我正在使用此库在我的应用程序中拥有类似Whatsapp样式的emojicons。 它显示软键盘位置的emojicons的方式是通过在其上方显示一个PopupWindow,使其完全覆盖它。
要创建emojicon的弹出窗口,我需要将一个View传递给构造函数。 我尝试传递两个不同的视图,但都无法工作。 这里是发生的事情:
  • 如果我传递对话框的根视图(使用getRootView()),弹出窗口不会出现在键盘上方,而是出现在对话框上方。调试后,我明白了这是因为对话框的根视图并不占据整个屏幕,而是恰好占据对话框的大小。我原以为它会更大,因为对话框背后的暗淡背景占据了整个屏幕。我错了。
    弹出窗口可以交互,并且按照预期工作。

  • 如果我传递包含对话框的活动的根视图,弹出窗口不仅出现在对话框和暗淡背景的后面(因此无法进行交互),而且还出现在键盘上方! 这是一个截图:

Result with Activity's root view

为什么它会出现在键盘下面而不是上面?我真的不理解。
我已经尝试通过更改windowSoftInputMode并将PopupWindow的"InputMethodMode"设置为PopupWindow.INPUT_METHOD_NOT_NEEDED来解决问题,但结果始终相同。
为了创建和显示弹出窗口,该库只需调用
public class EmojiconsPopup extends PopupWindow ... {

    ...

    setSize(LayoutParams.MATCH_PARENT, keyBoardHeight);
    ...
    showAtLocation(rootView, Gravity.BOTTOM, 0, 0);

    ...
}

当键盘打开时。 你可以从我在开头写的链接中查看库的源代码,这里有一个关于此问题的公开问题,以防它可能包含额外的有用信息。 感谢帮助。
2个回答

2
所以,我找到了一个解决方案。为了使弹出窗口在对话框打开时覆盖键盘,在调用showAtLocation(View rootView, int gravity, int x, int y)方法显示PopupWindow时,我们必须传递例如"0,-5000"而不是将"0,0"作为坐标传递。这样,通过将y坐标设置为足够低的整数,弹出窗口将正确显示在屏幕底部,而不是在对话框的根视图底部。
当然,第一个参数要传递的视图必须是对话框的根视图。
请记住,如果您在弹出窗口上调用了setClippingEnabled(false),当您使用如此低的y坐标调用showAtLocation时,它将从屏幕上消失。如果弹出窗口必须完整地保留在屏幕内,则isClippingEnabled()必须返回true。

0

我在想,Android 可能有比用于显示内容的根视图更多的根视图,您可以尝试使用提供的视图:

 getWindow().getDecorView()

如果失败了,那么尝试获取到你的根视图(即包含你内容的那个视图),然后:
View myRootView=findViewById(R.id.myroot);  myRootView.getRootView();

如果还不成功,您可以尝试进一步获取上述视图的根视图,逐个返回,直到没有更多的根视图返回为止,即:

myRootView=myRootView.getRootView();
//if it fails go up in hierarchy again, remember to test for null

myRootView=myRootView.getRootView();
//etc..

我认为向上一两级可能会得到一些东西


我已经尝试过向上追溯层级,但那是几天前的事情,所以我记不清了。我会再试一次。另外,昨天我本来要尝试使用DecorView,但最终我没有这么做。我肯定会去尝试的。 - nonzaprej
我尝试使用DecorViews,并多次调用getRootView(),但没有任何变化。 - nonzaprej
让我自己试试,我会回来给你答案。 - AguThadeus
顺便说一下,我试图在显示对话框之前显示PopupWindow,但当键盘打开时,弹出窗口会被向上推。PopupWindows的位置不应该受到这样的影响吗? - nonzaprej
他们的示例似乎在活动的根视图上正常工作,当您运行它时,示例是否按预期工作? - AguThadeus
显示剩余4条评论

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