在 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
传递给构造函数。我尝试传递两个不同的视图,但它对其中任何一个都不起作用。这是发生了什么:
如果我通过对话框的根视图(getRootView()
),弹出窗口不会出现在键盘顶部,而是出现在对话框顶部。调试后我明白这是因为对话框的根视图没有占据整个屏幕,而是对话框的大小。我认为它会更大,因为对话框后面的暗淡背景占据了整个屏幕。我错了。
弹出窗口是可交互的,并且可以正常工作。
如果我传递包含对话框的 activity 的根视图,弹出窗口不仅会出现在对话框和变暗的背景后面(因此无法与之交互),而且也出现在键盘上方!这是屏幕截图:
为什么它出现在那里而不是在键盘顶部?我真的不明白。
我已经尝试过更改 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 为真。
前提:"on top of"我的意思是"overlaying",可以这么说"higher z-index"; "above" 我的意思是 "visually above, on the screen"。
我想问题是“如何在显示对话框时在键盘顶部显示 PopupWindow?”。下面,情况...
我正在使用 this library 在我的应用程序中添加 Whatsapp 风格的表情符号。它显示表情符号代替软键盘的方式是在其顶部显示 PopupWindow
,以便完全覆盖它。
要创建表情符号的弹出窗口,我需要将 View
传递给构造函数。我尝试传递两个不同的视图,但它对其中任何一个都不起作用。这是发生了什么:
如果我通过对话框的根视图(
getRootView()
),弹出窗口不会出现在键盘顶部,而是出现在对话框顶部。调试后我明白这是因为对话框的根视图没有占据整个屏幕,而是对话框的大小。我认为它会更大,因为对话框后面的暗淡背景占据了整个屏幕。我错了。
弹出窗口是可交互的,并且可以正常工作。如果我传递包含对话框的 activity 的根视图,弹出窗口不仅会出现在对话框和变暗的背景后面(因此无法与之交互),而且也出现在键盘上方!这是屏幕截图:
为什么它出现在那里而不是在键盘顶部?我真的不明白。
我已经尝试过更改 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 为真。