美文网首页
Android控件<第十九篇>:系统菜单-Menu

Android控件<第十九篇>:系统菜单-Menu

作者: NoBugException | 来源:发表于2021-09-08 08:12 被阅读0次

系统菜单有两个,分别是:OptionMenu 和 ContextMenu

1、OptionMenu

OptionMenu是Android系统菜单的形式之一,它一般出现在ActionBar右侧;

当Menu的showAsAction属性设置为always时,如下代码:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_delete"
        android:orderInCategory="100"
        app:showAsAction="always"
        android:title="删除"/>
</menu>

菜单则直接显示在ActionBar的右侧,如图:

图片.png

当Menu的showAsAction属性设置为never时,如下代码:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_delete"
        android:orderInCategory="100"
        app:showAsAction="never"
        android:title="删除"/>
</menu>

右侧会出现三个点,这三个点就是ActionBar的Overflow,如图:

图片.png

点击之后,会弹出Menu:

图片.png

showAsAction还有一个属性:ifRoom,当Menu达到一定数量时,ActionBar右侧的菜单和Overflow将同时出现。

OptionMenu主要涉及两个方法,分别是:onCreateOptionsMenu、onOptionsItemSelected

实现代码如下:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.custom, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_delete:
            Toast.makeText(this, "删除被点击", Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
    }
    return true;
}
2、ContextMenu

ContextMenu,即上下文菜单。

ContextMenu可以和某控件绑定,长按该控件之后,在当前控件上弹出Menu,效果图如下:

图片.png

代码实现如下:

    Button button = findViewById(R.id.button);
    // ContextMenu和按钮绑定
    registerForContextMenu(button);
/**
 * 创建上下文菜单
 *
 * @param menu
 * @param v
 * @param menuInfo
 */
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.custom, menu);
}

/**
 * 上下文菜单选择监听
 *
 * @param item
 * @return
 */
@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_delete:
            Toast.makeText(this, "删除被点击", Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
    }
    return true;
}

上下文菜单的显示,是通过长按控件弹起的,长按事件有返回值:

    // 设置长按事件
    button.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            return false; // ContextMenu生效
        }
    });

当返回true时,ContextMenu失效,ContextMenu将不再弹起;
反之,ContextMenu生效。

[本章完...]

相关文章

网友评论

      本文标题:Android控件<第十九篇>:系统菜单-Menu

      本文链接:https://www.haomeiwen.com/subject/slxmwltx.html