前提:"在"之上我的意思是"覆盖",用更高的z-index",可以这么说;用"以上"我的意思是"在视觉上方,在屏幕上"。
我想问题是" 如何在显示对话框时在键盘顶部显示PopupWindow?"。以下,情况......
我使用this library在我的应用中使用Whatsapp风格的表情符号。它显示emojicons代替软键盘的方式是在它上面显示PopupWindow
,以便它完全覆盖它。
要创建emojicon的弹出窗口,我需要将View
传递给构造函数。我尝试传递两种不同的观点,但它们不能与它们中的任何一种一起使用。这里发生了什么:
如果我通过对话框的根视图(使用getRootView()
),则弹出窗口不会显示在键盘顶部,而是显示在对话框的顶部。经过调试后,我明白这是因为对话框的根视图并不是整个屏幕,而是对话框的大小。我认为它会更大,因为对话框背后的暗淡背景占据了所有的屏幕。我错了。
弹出窗口具有交互功能,可以正常工作。
如果我传递包含对话框的活动的根视图,弹出窗口不仅会出现在对话框后面和暗淡的背景(因此无法与之交互),而且还会出现在键盘上方!这是一个截图:
为什么它出现在那里而不是键盘顶部?我真的不明白。
我已经尝试过更改windowSoftInputMode
并设置PopupWindow
"输入方法模式"至PopupWindow.INPUT_METHOD_NOT_NEEDED
,但结果始终相同。
要创建并显示弹出窗口,库只需调用
public class EmojiconsPopup extends PopupWindow ... {
...
setSize(LayoutParams.MATCH_PARENT, keyBoardHeight);
...
showAtLocation(rootView, Gravity.BOTTOM, 0, 0);
...
}
键盘打开时。
您可以从我在开头写的链接看到图书馆的源代码,here's an open issue about this problem,以防它可能包含其他有用的信息。
感谢您的帮助。
答案 0 :(得分:2)
所以,我找到了解决方案。
在对话框打开时使键盘PopupWindow
覆盖,当调用showAtLocation(View rootView, int gravity, int x, int y)
方法显示PopupWindow而不是传递" 0,0"作为我们必须通过的坐标,例如," 0,-5000"。这样,使用足够低的整数作为y坐标,弹出窗口将在屏幕底部正确显示,而不是在对话框的根视图底部。
当然,作为第一个参数传递的视图必须是对话框的根视图。
请记住,如果您在弹出窗口中调用setClippingEnabled(false)
,当您使用如此低的y坐标调用showAtLocation时,它将从屏幕上消失。如果弹出窗口必须全部保留在屏幕内,isClippingEnabled()
必须返回true。
答案 1 :(得分: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..
我假设上一层或两层可能会给出一些东西