您的位置:华清远见教育科技集团 >> Android资料 >> Android系统菜单之快捷菜单  
 
Android系统菜单之快捷菜单
分享到:

Android系统快捷菜单(Context Menu)同样采用了浮动窗体的显示方式,与子菜单的实现方式相同,但两种菜单的启动方式却截然不同。

·启动方式:快捷菜单类似于普通桌面程序中的“右键菜单”,当用户点击界面元素超过2秒后,将启动注册到该界面元素的快捷菜单。

·使用方法:与使用选项菜单的方法非常相似,需要重载onCreateContextMenu()方法和onContextItemSelected()方法。

1.onCreateContextMenu()方法

onCreateContextMenu()方法主要用来添加快捷菜单所显示的标题、图标和菜单子项等内容,选项菜单中的onCreateOptionsMenu()方法仅在选项菜单第一次启动时被调用一次,而快捷菜单的onCreateContextMenu()方法每次启动时都会被调用一次。

代码清单1 onCreateContextMenu ()

final static int CONTEXT_MENU_1 = Menu.FIRST;
    final static int CONTEXT_MENU_2 = Menu.FIRST+1;
    final static int CONTEXT_MENU_3 = Menu.FIRST+2;
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo){
        menu.setHeaderTitle("快捷菜单标题");
        menu.add(0, CONTEXT_MENU_1, 0,"菜单子项1");
        menu.add(0, CONTEXT_MENU_2, 1,"菜单子项2");
        menu.add(0, CONTEXT_MENU_3, 2,"菜单子项3");
    }

ContextMenu类支持add()方法(代码第7行)和addSubMenu()方法,可以在快捷菜单中添加菜单子项和子菜单。

第5行代码的onCreateContextMenu()方法中的参数:第1个参数menu是需要显示的快捷菜单;第2个参数v是用户选择的界面元素;第3个参数menuInfo是所选择界面元素的额外信息。

2.onContextItemSelected ()方法

菜单选择事件的处理需要重载onContextItemSelected()方法,该方法在用户选择快捷菜单中的菜单子项后被调用,与onOptionsItemSelected ()方法的使用方法基本相同。

代码清单2 onContextItemSelected()

@Override
    public oolean onContextItemSelected(MenuItem item){
        switch(item.getItemId()){
            case CONTEXT_MENU_1:
                LabelView.setText("菜单子项1");
                return true;
            case CONTEXT_MENU_2:
                LabelView.setText("菜单子项2");
                return true;
            case CONTEXT_MENU_3:
                LabelView.setText("菜单子项3");
                return true;
        }
        return false;
    }

3.registerForContextMenu()方法

使用registerForContextMenu()方法,将快捷菜单注册到界面控件上(代码清单3中第7行)。这样,用户在长时间点击该界面控件时,便会启动快捷菜单。

为了能够在界面上直接显示用户所选择快捷菜单的菜单子项,在代码中引用了界面元素TextView(代码清单3中第6行),通过更改TextView的显示内容,显示用户所选择的菜单子项。

代码清单3 registerForContextMenu ()

TextView LabelView = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        LabelView = (TextView)findViewById(R.id.label);
        registerForContextMenu(LabelView);
    }

4.main.xml

代码清单4 main.xml

<TextView android:id="@+id/label"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="@string/hello"
    />

上述代码为/src/layout/main.xml文件的部分内容,第1行声明了TextView的ID为label,在代码清单3的第6行中,通过R.id.label将ID传递给findViewById()方法,这样用户便能够引用该界面元素,并能够修改该界面元素的显示内容。

需要注意的一点,代码清单4的第2行,将android:layout_width设置为match_parent,这样TextView将填充满父节点的所有剩余屏幕空间,用户点击屏幕TextView下方任何位置都可以启动快捷菜单。如果将android:layout_width设置为wrap_content,则用户必须准确单击TextView才能启动快捷菜单。

图1为快捷菜单的运行效果图。


图1 运行效果图

注:菜单可以像界面布局一样在XML文件中进行定义。使用XML文件定义界面菜单,将代码与界面设计分类,有助于简化代码的复杂程度,并且更有利于界面的可视化。

下面将快捷菜单的示例程序MyContextMenu改用XML实现,新程序的工程名称为MyXLMContoxtMenu。

首先需要创建保存菜单内容的XML文件:在/src目录下建立子目录menu,并在menu下建立context_menu.xml文件,代码如代码清单5所示。

代码清单5 context_menu.xml

<menu xmlns:android="//schemas.android.com/apk/res/android">
    <item android:id="@+id/contextMenu1"
    android:title="菜单子项1"/>
    <item android:id="@+id/contextMenu2"
        android:title="菜单子项2"/>
    <item android:id="@+id/contextMenu3"
        android:title="菜单子项3"/>
    </menu>

在描述菜单的XML文件中,必须以<menu>标签(代码第1行)作为根节点,<item>标签(代码第2行)用来描述菜单中的子项,<item>标签可以通过嵌套实现子菜单的功能。

XML菜单的显示结果如图2所示。


图2 XML菜单的显示结果

在XML文件中定义菜单后,在onCreateContextMenu()方法中调用inflater.inflate()方法,将XML资源文件传递给菜单对象,代码如代码清单6所示。

代码清单6 onCreateContextMenu()

@Override
    public void onCreateContextMenu(ContextMenu menu,
            View v, ContextMenuInfo menuInfo){
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.context_menu, menu);
    }

第4行代码中的getMenuInflater()为当前的Activity返回MenuInflater;第5行代码将XML资源文件R.menu.context_menu,传递给menu这个快捷菜单对象。

 更多相关文章

·Android系统菜单之子菜单
·Android系统菜单之选项菜单
·Android系统控件TabHost
·Android系统控件ListView
·Android系统控件Spinner