Android开发之菜单介绍2:上下文菜单(ContextMenu)

2014-08-17 14:48:50|?次阅读|上传:huigezrx【已有?条评论】发表评论

关键词:Java, Android, 移动应用, 界面设计|来源:唯设编程网

在Android 应用程序中, 菜单是经常使用的界面元素。Android平台下所提供的菜单大体上可分为两类:选项菜单(Option menu)和上下文菜单(context menu)。

Android开发之菜单介绍1:选项菜单(Option menu)介绍了Android选项菜单的基本概念和用法,本文继续介绍Android的另一种菜单:上下文菜单(contextmenu)。

ContextMenu 是Menu 的子类型, 你可以对其进行配置,这样当用户在Vlew 上长时单击时它将显示出来。顾名思义, ContextMenu提供给用户一个针对所选项的上下文关联菜单。

ContextMenu对象比optionsMenu对象稍微复杂一些。要显示它, 你需要实现Activity 的onCreateContextMenu() 方法。但是, 在调用它之前,你必须先调用registerForContextMenu() 方法, 井且传入需要在其中显示上下主菜单的View对象。这意盹着屏幕上的每一个View 均可以拥有一个上下立菜单, 这样可以使菜单与需要进行的操作之间高度关联。

下面我们给出了一个Chronometer 计时器的例于,它能够对用户长时单击做出反应,并弹出一个上下主菜单:

registerForContextMenu(timer);

在调用了registerForContextMenu() 方法并执行之后, 用户则可以在View 上进行长时单击,从而打开上下文菜单。每一次进行这样的操作时, Activity 的onCreateContextMenu ()方法都会被调用,其中的代码也都会被执行。

下面是上面所使用的Chronometer 控件所关联的上下文菜单的对应代码:

    @Override
    public void onCreateContextMenu(
            ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);

        if (v.getId() == R.id.Chronometer01) {
            getMenuInflater().inflate(R.menu.timer_context, menu);
            menu.setHeaderIcon(android.R.drawable.ic_media_play)
                    .setHeaderTitle("Timer controls");
        }
    }

前面我们提到过, 当用户进行长时单击时,任何View 控件都可以注册并触发对onCreateContextMenu( ) 方法的调用。这意味着我们需要检测用户想调出哪个View 控件的上下文菜单。下一步,我们根据使用XML 定义的菜单资源对前面的菜单进行扩充。 由于我们不能在菜单资源文件中定义头信息, 所以我们为其设置一个Androîd SDK 中储备的资源,并且添加一个标题。下面是扩展的菜单资源对应的布局文件(timer_context.xml):

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/start_timer"
        android:title="Start" />
    <item
        android:id="@+id/stop_timer"
        android:title="Stop" />
    <item
        android:id="@+id/reset_timer"
        android:title="reset" />
</menu>

上面的代码定义了3 个菜单项。如果它不是一个上下文菜单, 那么我们可以为其设置图标。不过,上下文菜单并不支持图标, 也不支持子菜单或者快捷键。 更多有关设置菜单资源的内容,你可以查看相关资料。

现在,我们需要实现Activity的onContexItemSelected ()方法以处理ContextMenu的单击事件了。 下面给出了示例代码:

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        super.onContextItemSelected(item);

        boolean result = false;
        Chronometer timer = (Chronometer) findViewById(R.id.Chronometer01);
        switch (item.getItemId()) {
            case R.id.stop_timer:
                timer.stop();
                result = true;
                break;
            case R.id.start_timer:
                timer.start();
                result = true;
                break;
            case R.id.reset_timer:
                timer.setBase(SystemClock.elapsedRealtime());
                result = true;
                break;
        }
        return result;
    }

最终实现的效果如下:

Android开发之菜单介绍2:上下文菜单(ContextMenu)

因为在这个例于中,我们只有一个上下文菜单,所以在这个方法中,我们找到了Chronometer 视图。无论哪个上下文菜单项被选择, 该方法都会被调用,所以, 你需要注意资源标识符的唯一性, 或者记录下到底是哪一个菜单被显示出来了。 由于每次需要显示上下文菜单时它都会被创建,所以这是可以实现的。

发表评论0条 】
网友评论(共?条评论)..
Android开发之菜单介绍2:上下文菜单(ContextMenu)