在 Dialog 显示时显示 PopupWindow

Display PopupWindow while Dialog is showing

前提:"on top of"我的意思是"overlaying",可以这么说"higher z-index"; "above" 我的意思是 "visually above, on the screen"。

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

我正在使用 this library 在我的应用程序中添加 Whatsapp 风格的表情符号。它显示表情符号代替软键盘的方式是在其顶部显示 PopupWindow,以便完全覆盖它。

要创建表情符号的弹出窗口,我需要将 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);

    ...
}

当键盘打开时。

你可以从我一开始写的 link 和 here's an open issue about this problem 中看到库的源代码,以防它包含额外的有用信息。

感谢您的帮助。

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

 getWindow().getDecorView()

如果失败,请尝试获取对您的根视图(包含您的内容的视图)的引用,然后:

View myRootView=findViewById(R.id.myroot);  myRootView.getRootView();

再次如果不成功,您可以进一步尝试将上述视图的根视图逐一返回,直到returns不再有根视图,即:

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

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

我假设在层次结构中上升一两次可能会有所帮助

所以,我找到了解决办法。 要在对话框打开时使 PopupWindow 覆盖键盘,当调用 showAtLocation(View rootView, int gravity, int x, int y) 方法显示 PopupWindow 而不是传递“0, 0”作为我们必须传递的坐标时,例如,“ 0, -5000”。这样,使用足够低的整数作为 y 坐标,弹出窗口将正确显示在屏幕底部而不是对话框根视图的底部。

作为第一个参数传递的视图当然必须是对话框的根视图。

请记住,如果您在弹出窗口中调用了 setClippingEnabled(false),当您使用如此低的 y 坐标调用 showAtLocation 时,它会从屏幕上消失。如果弹出窗口必须整个留在屏幕内,isClippingEnabled() 必须 return 为真。