procedure TForm1.Button1Click(Sender: TObject)
var
i:integer
Item:TMenuItem
begin
for i:=0 to Memo1.Lines.Count-1 do
begin
Item:=TMenuItem.Create(Owner)
Item.Caption:=Memo1.Lines.Strings[i]
Item.Hint:=Memo1.Lines.Strings[i]
Item.OnClick:=MenuItemClick
PopupMenu1.Items.Add(Item)
end
end
procedure TForm1.MenuItemClick(Sender:TObject)
begin
ShowMessage(TMenuItem(Sender).Hint)
end
d出效果如下图所示
可以使用setGravity()方法来指定d出窗口与anchor视图的对齐方式,例如修改对齐方式为Gravity.END
使用起来还是比较简单的,但是好像大部分项目的需求是PopupMenu在用户点击的位置d出,然而PopupMenu并没有提供在指定坐标d出的方法,所以只能咱们自己来实现咯!
想让PopupMenu在指定d出位置,首先咱们得先了解show()方法是如何让PopupMenud出来的,所以只能去阅读源码了(Read The Fucking Source Code~)。
PopupMenu的show()方法很简单,直接把任务转给MenuPopupHelper来处理,处理流程:show() ->tryShow() -> showPopup(0, 0, false, false)
我们可以看到showPopup方法内有两个参数int xOffset、int yOffset,根据注释可以知道这就是相对于anchor视图的坐标值。所以如果要指定PopupMenu的d出位置,MenuPopupHelper应该这样处理d出逻辑:show(int x, int y) ->tryShow(int x, int y) ->showPopup(x, y, true, true)。
但是由于PopupMenu无法调用到MenuPopupHelper的show(int x, int y) 方法,因此我们只能使用反射机制绕过PopupMenu,直接调用MenuPopupHelper的show(int x, int y)方法。
到此为止,已经有了大致的解决思路,接下来看看具体实现。
最终d出效果如下图所示
小编最近在写一个安卓程序,想要实现一个下拉菜单功能,开始想着用Spinner,后来发现不对,Spinner有默认选项;看到有人用popupwindow实现的,不过后来发现popupmenu好像更适合,以后再去看popupwindow好了。现在记录下popupwindow的简单用法。工具/原料
android studio
genymotion
方法/步骤
1
在布局文件中添加一个Button,单击Button,d出菜单。(也可将Button换成ImageView或是其它,这里只是示例)
2
从上一步中,可以看到,我们给Button添加一个单击事件popupMenu,接下来,就在java文件中实现该方法。
3
在上一步倒数第三行中,我们加载了一个menu文件“popupmenu”。添加的位置及代码见下图:
4
当然,别忘了在onCreate方法中初始化Button。
5
最后看下效果吧!
END
注意事项
这只是个简单的demo,在实际应用中,需要结合其它一起使用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)