没有自动对焦的上下文菜单

时间:2012-12-21 11:59:50

标签: android contextmenu android-actionbar

我想在用户触摸按钮时打开“上下文菜单”。

我搜索没有成功获得没有自动对焦的默认Android上下文菜单的解决方案。对我来说,默认的自动对焦是一个痛苦的问题,因为它强制用户(在菜单窗口之外)额外点击以选择主窗口上的另一个项目。

我的活动提供了一个包含 g1 g2 ,...的网格视图,并且上下文菜单会显示textareas t1 列表, t2 ......这就是我需要的:

  1. 当用户点击 g1 时,屏幕底部会显示一个菜单(我需要能够自定义菜单布局)
  2. 当用户点击 g1 时,窗口的其余部分不会消失,即他应该仍能正常查看主窗口,除了底部菜单占用的空间
  3. 当用户点击 g1 时,他没有松开当前窗口的焦点,即如果他在菜单打开后点击g2, g2 将正常行动而不需要额外点击
  4. 假设用户点击 g1 ,然后点击 g2 :当前的上下文菜单应该关闭并打开一个新的菜单,刷新为b2
  5. 我需要为从minsdkversion = 8开始的应用程序执行此操作(似乎我无法使用“操作栏”)
  6. 希望这是有道理的,如果没有,请告诉我。

    我想破解默认的上下文菜单以这种方式自定义会有太多麻烦吗?创建我自己的完全没问题。但我不知道从哪里开始。 那么你能指出我实现我想要的方向吗?

    感谢您的时间

1 个答案:

答案 0 :(得分:0)

有两个建议如何使用自定义上下文菜单。

变体A:也许您可以选择将当前布局包装到RelativeLayout中,然后添加LinearLayout(包含您自定义的上下文菜单)用户点击g1后立即RelativeLayout。单击g2后,删除旧版LinearLayout并添加一个relativeLayout.addView(contextMenuLayout)的新版本。要将LinearLayout置于底部,请务必在其上使用contextMenuLayout.setLayoutParams(...)并传递RelativeLayout.LayoutParams的实例,并设置“对齐父级底部”和“居中水平”。由于您的contextMenuLayoutRelativeLayout的最后一个元素,因此会将其绘制在最顶层。焦点将按您的意愿行事。

变体B :将当前版面包裹为垂直方向的LinearLayout。第一个单元格包含您当前的布局。第二个单元格可能包含您自定义的上下文菜单,您可以像在变体A中一样添加和删除。两个优点:首先,您的原始布局不会被上下文视图覆盖,并且这样一切都始终可见。其次,您可以将'LinearLayout'设置为“animateLayoutChanges”,这使得上下文菜单可以使用Android API11 +顺利淡入(在早期版本中被忽略)。

变体A和B作为伪代码(两者都相似):

class YourActivity extends Activity implements OnItemClickListener {

    View contextMenu = null;

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        // this could be RelativeLayout (Variant A) or LinearLayout (Variant B) which in turn contains your Layout
        Layout rootLayout = (Layout)findViewById(R.id.root_layout);

        // in case there is a context menu open, remove it
        if(contextMenu!=null)
            rootLayout.removeView(contextMenu);

        // add new self-defined context menu
        contextMenu = getContextMenuView();
        rootLayout.addView(contextMenu);
    }

    private View getContextMenuView() {
        Layout contextMenuView = new LinearLayout(...);
        .... add contents ...
        return contextMenuView;
    }

    ....
}

请注意,您需要将rootLayout强制转换为LinearLayoutRelativeLayout,因为Layout本身没有addView(...)方法。