在对话框显示

时间:2015-09-10 22:07:55

标签: android android-dialog android-popupwindow

前提:"在"之上我的意思是"覆盖",用更高的z-index",可以这么说;用"以上"我的意思是"在视觉上方,在屏幕上"。

我想问题是" 如何在显示对话框时在键盘顶部显示PopupWindow?"。以下,情况......

我使用this library在我的应用中使用Whatsapp风格的表情符号。它显示emojicons代替软键盘的方式是在它上面显示PopupWindow,以便它完全覆盖它。

要创建emojicon的弹出窗口,我需要将View传递给构造函数。我尝试传递两种不同的观点,但它们不能与它们中的任何一种一起使用。这里发生了什么:

  • 如果我通过对话框的根视图(使用getRootView()),则弹出窗口不会显示在键盘顶部,而是显示在对话框的顶部。经过调试后,我明白这是因为对话框的根视图并不是整个屏幕,而是对话框的大小。我认为它会更大,因为对话框背后的暗淡背景占据了所有的屏幕。我错了。
    弹出窗口具有交互功能,可以正常工作。

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

Result with Activity's root view

为什么它出现在那里而不是键盘顶部?我真的不明白。

我已经尝试过更改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,以防它可能包含其他有用的信息。

感谢您的帮助。

2 个答案:

答案 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..

我假设上一层或两层可能会给出一些东西