Menu控件(Android设置选项菜单和快捷菜单)

首先区分一下什么是选项菜单,什么是快捷菜单。

选项菜单是针对整个页面布局的,在这个页面布局的右上方,点击之后可以会展开选项,供大家选择。

快捷菜单正如其名,十分方便,因为他可以依赖于任何控件,定义之后只需要长摁此控件,菜单列表就会出现,如右:

定义选项菜单和快捷菜单都是有两种方法,一种是直接在activity文件中代码书写,这种方法相对比较繁琐,但是灵活性更高。还有一种是通过菜单布局文件直接定义。但是和之前所有的控件相同,要实现效果都要在activity中书写。

1.选项菜单:

1.1.使用菜单布局文件实现的选项菜单

首先在res文件中创建文件夹menu,在文件内写出菜单布局文件submeun.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:title="Add"
        android:icon="@drawable/add"
        android:id="@+id/menu_add">
        <menu>
            <item
                android:title="User"
                android:icon="@drawable/user"
                android:id="@+id/menu_adduser"/>
            <item
                android:title="Document"
                android:icon="@drawable/doc"
                android:id="@+id/menu_add_document"/>
        </menu>
    </item>
    
    <item
        android:title="Save"
        android:icon="@drawable/save"
        android:id="@+id/menu_save" />
    
    <item
        android:title="Delete"
        android:icon="@drawable/delete"
        android:id="@+id/menu_delete"/>
</menu>

然后在MainActivity中实例化这个菜单,代码如下:

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    //实例化菜单
    MenuInflater inflater=getMenuInflater();
    inflater.inflate(R.menu.submenu ,menu);
    return true;
}

1.2.在activity中直接创建选项菜单,在MainActivity写如下代码:

//定义菜单项常量
final static int MENU_ADD = Menu.FIRST;
final static int MENU_SAVE = Menu.FIRST + 1;
final static int MENU_DELETE = Menu.FIRST + 2;
final static int MENU_ADDUSER = Menu.FIRST + 3;
final static int MENU_ADDDOCUMENT = Menu.FIRST + 4;

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    //添加菜单项
    SubMenu sub = menu.addSubMenu(0, MENU_ADD, 0, "添加").setIcon(R.drawable.add);
    //menu.add(0, MENU_ADD, 0, "添加").setIcon(R.drawable.add);
    sub.add(0,MENU_ADDUSER,0,"添加用户").setIcon(R.drawable.user);
    sub.add(0,MENU_ADDDOCUMENT,1,"添加文档").setIcon(R.drawable.doc);
    menu.add(0,MENU_SAVE,2,"保存").setIcon(R.drawable.save);
    menu.add(0,MENU_DELETE,1,"删除").setIcon(R.drawable.delete);

    return true;
}

1.3怎么给这些选项设置点击事件呢?代码如下:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case MENU_ADD:                  //如果是用菜单布局文件写的,应该改为case R.id.menu_add
            Toast.makeText(MainActivity.this, "添加", Toast.LENGTH_SHORT).show();
            isSaved=false;
            break;
        case MENU_SAVE:
            Toast.makeText(MainActivity.this, "保存", Toast.LENGTH_SHORT).show();
            isSaved=true;
            break;
        case MENU_DELETE:
            Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_SHORT).show();
            break;
        case MENU_ADDUSER:
            Toast.makeText(MainActivity.this, "添加用户", Toast.LENGTH_SHORT).show();
            break;
        case MENU_ADDDOCUMENT:
            Toast.makeText(MainActivity.this, "添加文档", Toast.LENGTH_SHORT).show();
            break;
    }

    return super.onOptionsItemSelected(item);
}

1.4我们看到的public boolean onCreateOptionsMenu(Menu menu){}函数,只对菜单初始化一次,那么当外界有些事情触发引起菜单的改变,该怎么设置呢?我们有专门的初始化函数,代码如下:

//记录保存状态
private boolean isSaved=false;

//动态修改菜单项
@Override
public boolean onPrepareOptionsMenu(Menu menu){
    MenuItem item=menu.findItem(MENU_SAVE);
    if (isSaved){
        item.setTitle("Save");
        item.setEnabled(false);   //设置能否点击
    }
    else{
        item.setTitle("Save*");
        item.setEnabled(true);
    }
    return true;
}

2.快捷菜单

2.1.使用菜单布局文件实现的选项菜单

菜单布局文件直接使用上面那个,下面直接看实例化菜单代码,你会发现其实差不多:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView txt=(TextView)findViewById(R.id.txtTest);
    registerForContextMenu(txt);               //把快捷菜单绑定到这个文本控件上
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    
    //实例化菜单代码
    MenuInflater inflater=getMenuInflater();
    inflater.inflate(R.menu.submenu ,menu);
}

2.2.在activity中直接创建快捷菜单,在MainActivity写如下代码:

//定义菜单项常量
final static int MENU_ADD = Menu.FIRST;
final static int MENU_SAVE = Menu.FIRST + 1;
final static int MENU_DELETE = Menu.FIRST + 2;
final static int MENU_ADDUSER = Menu.FIRST + 3;
final static int MENU_ADDDOCUMENT = Menu.FIRST + 4;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView txt=(TextView)findViewById(R.id.txtTest);
    registerForContextMenu(txt);     //绑定菜单
}

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

    SubMenu sub = menu.addSubMenu(0, MENU_ADD, 0, "添加").setIcon(R.drawable.add);
    sub.add(0,MENU_ADDUSER,0,"添加用户").setIcon(R.drawable.user);
    sub.add(0,MENU_ADDDOCUMENT,1,"添加文档").setIcon(R.drawable.doc);
    menu.add(0, MENU_SAVE, 2, "保存").setIcon(R.drawable.save);
    menu.add(0, MENU_DELETE, 1, "删除").setIcon(R.drawable.delete);
}

快捷菜单每次从新点击控件之后都会初始化,所以不需要像上面的public boolean onPrepareOptionsMenu(Menu menu){}函数,初始化内容直接写在creat代码里即可。

2.3怎么给这些选项设置点击事件呢?代码和上面差不多,就是函数名不同,代码如下:

@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case MENU_ADD:
            Toast.makeText(MainActivity.this, "添加", Toast.LENGTH_SHORT).show();
            isSaved=false;
            break;
        case MENU_SAVE:
            Toast.makeText(MainActivity.this, "保存", Toast.LENGTH_SHORT).show();
            isSaved=true;
            break;
        case MENU_DELETE:
            Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_SHORT).show();
            break;
        case MENU_ADDUSER:
            Toast.makeText(MainActivity.this, "添加用户", Toast.LENGTH_SHORT).show();
            break;
        case MENU_ADDDOCUMENT:
            Toast.makeText(MainActivity.this, "添加文档", Toast.LENGTH_SHORT).show();
            break;
    }

    return super.onContextItemSelected(item);
}

好了,今天就介绍到这,代码在这里:https://download.csdn.net/download/qq_38367681/10803684

发布了113 篇原创文章 · 获赞 33 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_38367681/article/details/84399563