如何动态添加popupmenu里面的item-CSDN论坛

如何动态添加popupmenu里面的item-CSDN论坛,第1张

按照Memo1中的列表生成PopupMenu,这里设置了Item的hint,把内容通过hint传递。

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,在实际应用中,需要结合其它一起使用。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11660061.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存