Android控件 常见的Menu使用方法

Android里的选项菜单中的项目将出现在操作栏中,用户通过操作栏右侧的操作或者点击设备,菜单按钮来溢出菜单图标。这里介绍 context menu、popup menu 和 option menu 的实现方法。

Context Menu 创建流程 方法1:

1.创建 menu.xml 文件
2.给菜单注册按钮 registerForContextMenu(findViewById(R.id.button_context));
3.创建菜单 @Override onCreateContextMenu
4.菜单项目操作 @Override onContextItemSelected

创建 menu.xml 文件
首先需要在res目录下新建menu文件夹
在这里插入图片描述
在这里插入图片描述
在xml文件的Design页面中,拖动Palette中的菜单条目到Component Tree中放置,然后在右边的Attribute栏中修改属性值或在Code页面中手动写入id和title属性。
在这里插入图片描述
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

代码实现:

//创建菜单 @Override onCreateContextMenu
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    getMenuInflater().inflate(R.menu.context, menu);
}

//菜单项目操作 @Override onContextItemSelected
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
    switch (
            item.getItemId()) {
        case R.id.delete1 :
            makeToast("delete");
            break;

        case R.id.rename :
            makeToast("rename");
            break;

        case R.id.share :
            makeToast("share");
            break;
    }
    return super.onContextItemSelected(item);
}

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    //给菜单注册按钮 registerForContextMenu(findViewById(R.id.button_context));
    registerForContextMenu(findViewById(R.id.button_context));
}

长按View后的样式:
在这里插入图片描述

Context Menu 创建流程 方法2:

1.创建 menu.xml 文件
2.实现 menu 上下文模式 new ActionMode.Callback()
3.在View的长按事件中启动 menu 上下文操作模式

代码实现:

//在onCreate中:
final ActionMode.Callback callback = new ActionMode.Callback() {
	//创建,在启动上下文操作模式(startActionMode(Callback))时调用
	@Override
	public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
	    Log.e("TAG","创建");
	    getMenuInflater().inflate(R.menu.context, menu);
	    return true;
	}
	
	//在创建方法后进行调用
	@Override
	public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
	    Log.e("TAG","准备");
	    return false;
	}
	
	@Override
	public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
	    Log.e("TAG","点击");
	    switch (menuItem.getItemId()){
	        case R.id.delete1 :
	            makeToast("delete");
	            break;
	
	        case R.id.rename :
	            makeToast("rename");
	            break;
	
	        case R.id.share :
	            makeToast("share");
	            break;
	    }
	    return true;
	}
	//上下文操作模式结束时被调用
	@Override
	public void onDestroyActionMode(ActionMode actionMode) {
	    Log.e("TAG","结束");
	}
};

findViewById(R.id.button_context2).setOnLongClickListener(new View.OnLongClickListener() {
	@Override
	public boolean onLongClick(View view) {
	    startActionMode(callback);
	    return false;
	}
});

长按View后的样式:
在这里插入图片描述

Popup Menu 创建流程 :

1.实例化 popupMenu 对象
2.加载菜单资源
3.为PopupMenu设置点击监听器
4.显示PopupMenu

代码实现:

//onCreate中:
//1.实例化PopupMenu对象 (参数2:被锚定的view)
final Button button = findViewById(R.id.button_popup);
final PopupMenu menu = new PopupMenu(this, button);

//2.加载菜单资源:利用MenuInflater将Menu资源加载到PopupMenu.getMenu()所返回的Menu对象中
//将R.menu.xx对于的菜单资源加载到弹出式菜单中
menu.getMenuInflater().inflate(R.menu.context, menu.getMenu());

//3.为PopupMenu设置点击监听器
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
    @Override
    public boolean onMenuItemClick(MenuItem menuItem) {
        switch (menuItem.getItemId()){
            case R.id.delete1 :
                makeToast("delete");
                break;

            case R.id.rename :
                makeToast("rename");
                break;

            case R.id.share :
                makeToast("share");
                break;
        }
        return false;
    }
});

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //4.显示PopupMenu
        menu.show();
    }
});

按View后的样式:
在这里插入图片描述

Option Menu 创建流程:

1.重写方法 onCreateOptionsMenu,并加载布局
2.重写方法 onOptionsItemSelected,设置功能

代码实现:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.context, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()) {
        case R.id.delete1 :
            makeToast("delete");
            break;

        case R.id.rename :
            makeToast("rename");
            break;

        case R.id.share :
            makeToast("share");
            break;

        default:
            super.onOptionsItemSelected(item);
    }
    return true;
}

在style.xml定义标题栏的样式和optionMenu的样式

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>

        <item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item>
    </style>

    <style name="OverflowMenuStyle" parent="Base.Widget.AppCompat.Light.PopupMenu.Overflow">
        <!-- 不让它覆盖 ActionBar -->
        <item name="overlapAnchor">false</item>
        <item name="android:dropDownVerticalOffset">4dp</item>
        <item name="android:dropDownHorizontalOffset">0dp</item>
    </style>

</resources>

样式展示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值