【问题标题】:Opening a Context menu on long press for a View?长按打开上下文菜单以查看视图?
【发布时间】:2013-04-19 17:54:16
【问题描述】:

我看到的所有关于上下文菜单的示例和问题都是在您将上下文菜单注册到按钮或类似内容的地方。在我的情况下,我有一个显示大小的视图(OSMDroid 地图视图),它实现了长按手势,它将传入地图视图中的按下节点。我希望长按打开上下文菜单,以便我可以对该节点进行操作。

问题是当我为上下文菜单注册 MapView 时,当按下视图本身或视图上的节点时,长按将触发。例如它已为视图注册。 (糟糕!)

如果我没有为视图注册上下文菜单,我的长按只会在选择节点时触发。 (好!)但是我不知道如何以编程方式显示或触发未首先注册的上下文菜单。

我只需要按需显示上下文菜单。有人有什么建议吗?谢谢!

@Override
public void onCreate(final Bundle savedInstanceState) {
    ...
    this.mapView = (MapView) findViewById(R.id.mapview);
    this.registerForContextMenu(this.mapView); // <-- This will register the entire view for a long press context menu
    ...
}
...

class NodeGestureListener implements OnItemGestureListener<NodeOverlayItem> {
    @Override
public boolean onItemLongPress(int index, NodeOverlayItem node) {
    openContextMenu(mapView);  // <-- This won't display anything
    return false;
}
}
...

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {  
    super.onCreateContextMenu(menu, v, menuInfo);
    getMenuInflater().inflate(R.menu.node_menu, menu);
}

【问题讨论】:

    标签: android contextmenu osmdroid


    【解决方案1】:

    每件事都有它自己的目的和结构。因此,按照应有的方式使用某些东西总是更好。菜单也是如此。

    在您的情况下,我认为如果您希望在没有上下文菜单机制的情况下长时间单击事件后立即弹出窗口,那么最好使用 AlertDialog。

    【讨论】:

    • 我正在正确使用上下文菜单。这是我坚持的观点,它只是在长按侦听器之前触发 onCreateContextMenu 。现有的 MapView 长按侦听器正在执行自己的默认行为。我不希望这样,但我认为在触发长按时打开上下文菜单会更容易。
    • AlertDialog 是不够的。其中一个我选择 ContextMenu,因此我可以包含许多选项,可能是动态的。
    • 您可以使用任何您喜欢的设计来创建自定义对话框
    • 我将看看如何创建自定义对话框。我以为您建议使用带有正面/负面提示的 AlertDialog。
    • 好的,我把它给你的建议。我最终编写了一个有效的自定义 DialogFragment。这有点努力,但最终的控制是值得的。
    【解决方案2】:

    您可以查看操作栏。虽然它是为 3.0 开发的,但支持库使它适用于更老的东西。 docs 似乎表明菜单样式 你使用的不是首选,而操作栏是要走的路。奖励:我发现它比旧的长按菜单更容易处理。

    【讨论】:

    • 我可以使用操作栏。我有点期待菜单可以传达更多信息,而不仅仅是几个按钮。长按适用于我的 OSMdroid 地图上的节点,所以我不确定您所说的“旧长按菜单”是什么意思。
    猜你喜欢
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 2013-01-28
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多