学而实习之 不亦乐乎

Android:上下文菜单的使用

2020-10-07 20:41:24

一、下文菜单简介

通常上下文菜单是以浮动菜单的形式呈现的,用户长按(按住)一个支持上下文菜单的View时,菜单将以浮动列表的形式出现(类似于对话框)。 通常用户一次可对一个项目执行上下文操作(比如一个单独的控件或列表中的一项)。

Android 用 ContextMenu 来代替上下文菜单,与开发选项菜单方法十分类似,因为 ContextMenu 继承了 Menu 。

要提供浮动上下文菜单,可以参照以下步骤:
1.在Activity或Fragment中重写 onCreateContextMenu() 方法,加载 XML 类型的 Menu 资源或者使用代码动态生成 Menu 。
2.在Activity或Fragment中调用registerForContextMenu(View view)方法,来注册需要和上下文菜单关联的View。如果将ListView或GridView作为参数传入,那么每个列表项将会有相同的浮动上下文菜单。
3.在Activity或Fragment中重写 onContextItemSelected() 方法,实现菜单项的点击逻辑。

二、实例

XML代码:

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/context_option_add"
        android:title="添加"/>
    <item android:id="@+id/context_option_delete"
        android:title="删除"/>
    <item android:id="@+id/context_option_save"
        android:title="保存"/>
</menu>

Java代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_context_menu);
 
    //初始化ListView
    ListView listView= (ListView) findViewById(R.id.list_context_menu);
    ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1,createDataList());
    listView.setAdapter(adapter);
 
    //为ListView注册上下文浮动菜单
    registerForContextMenu(listView);
}
 
//生成测试数据List
private List<String> createDataList(){
    List<String> list=new ArrayList<>();
    for(int i=0;i<10;i++){
        list.add("测试条目"+i);
    }
    return list;
}
 
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater=getMenuInflater();
    inflater.inflate(R.menu.context_menu,menu);
}
 
@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case R.id.context_option_add:
            Toast.makeText(this,"添加",Toast.LENGTH_SHORT).show();
            return true;
        case R.id.context_option_save:
            Toast.makeText(this,"保存",Toast.LENGTH_SHORT).show();
            return true;
        case R.id.context_option_delete:
            Toast.makeText(this,"删除",Toast.LENGTH_SHORT).show();
            return true;
        default:
            return super.onContextItemSelected(item);
    }
}

在 onCreateContextMenu() 方法中,方法参数包括用户所选的View,以及一个提供有关所选项目的附加信息的 ContextMenu.ContextMenuInfo 对象。如果需要为多个View设置不同的上下文菜单,则可使用这些参数确定要加载的上下文菜单资源。

在 onContextItemSelected() 方法中,成功处理菜单项的监听事件后,系统将返回 true。需要注意在default分支中,应该调用 super.onContextItemSelected(item)。如果 Activity包括 Fragment,则系统将依次为 Activity 和每个 Fragment(按照每个Fragment的添加顺序)调用 onContextItemSelected() 方法,直到有一个返回结果为 true 或所有 Fragment 都调用完毕为止。