Android-UI 三种menu的基本实现

    技术2025-07-30  14

    文章目录

    Menu分类Optionoption.xml代码实现 Contextcontext.xml绑定view代码实现 绑定上下文代码实现 Popuppopup.xml代码实现 记录三种menu的基本使用方法 IDE:Android Studio 4.0

    Menu分类

    选项菜单OptionMenu上下文菜单ContextMenu弹出菜单PopupMenu

    Option

    option.xml

    showAsAction属性值 always:直接在标题栏显示 never:不显示 withText:控制图标和文本一起显示 ifRoom:有空间就显示

    <?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/save" android:title="保存" app:showAsAction="always" /> <item android:id="@+id/setting" android:title="设置" /> <item android:title="更多"> <menu> <item android:id="@+id/exit" android:title="退出" /> <item android:title="子菜单1" /> </menu> </item> </menu>

    代码实现

    实现起来相对比较容易,在选中方法里直接用switch来判断用户点击的是哪一个选项

    //创建OptionMenu @Override public boolean onCreateOptionsMenu(Menu menu) { //加载菜单资源 getMenuInflater().inflate(R.menu.option, menu); return true; } //OptionMenu菜单项的选中方法 @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.save: Toast.makeText(this, "保存", Toast.LENGTH_SHORT).show(); break; case R.id.setting: Toast.makeText(this, "设置", Toast.LENGTH_SHORT).show(); break; case R.id.exit: finish(); break; } return super.onOptionsItemSelected(item); }

    Context

    context.xml

    <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/delete" android:title="删除" /> <item android:id="@+id/rename" android:title="重命名" /> </menu>

    绑定view

    这里绑定的是ctx_btn 长按ctx_btn效果

    代码实现

    先在onCreate方法中进行注册,绑定某个view

    registerForContextMenu(findViewById(R.id.ctx_btn));

    创建 覆盖onCreateContextMenu方法

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

    菜单项的操作 覆盖onContextItemSelected方法

    //Context菜单的操作 @Override public boolean onContextItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.delete: Toast.makeText(this, "删除", Toast.LENGTH_SHORT).show(); break; case R.id.rename: Toast.makeText(this, "重命名", Toast.LENGTH_SHORT).show(); break; } return super.onContextItemSelected(item); }

    绑定上下文

    长按ctx_btn效果

    代码实现

    实现ActionMode.CallBack方法,并传给对象cb

    ActionMode.Callback cb = new ActionMode.Callback() { //创建,在启动上下文模式(startActionMode(Callback))时调用 @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { //这里要返回true Log.e("TAG", "创建"); getMenuInflater().inflate(R.menu.context, menu); return true; } //在创建方法后调用 @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { Log.e("TAG", "准备"); return false; } //点击时调用 @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { //这里同样要返回true Log.e("TAG", "点击"); switch (item.getItemId()) { case R.id.delete: Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_SHORT).show(); break; case R.id.rename: Toast.makeText(MainActivity.this, "重命名", Toast.LENGTH_SHORT).show(); break; } return true; } //上下文操作模式结束时调用 @Override public void onDestroyActionMode(ActionMode mode) { Log.e("TAG", "结束"); } };

    在onCreate方法中通过长按监听器启动上下文操作模式

    findViewById(R.id.ctx_btn).setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { startActionMode(cb); return false; } });

    Popup

    点击popBtn效果

    popup.xml

    <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/copy" android:title="复制" /> <item android:id="@+id/paste" android:title="粘贴" /> </menu>

    代码实现

    final Button popBtn=findViewById(R.id.pop_btn); popBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //实例化PopupMenu对象(参数2:被锚定的view) PopupMenu menu =new PopupMenu(MainActivity.this,popBtn); //加载菜单资源:利用MenuInflater将Menu资源加载到PopupMenu.getMenu()所返回的Menu对象中 //将R.menu.xx对应的菜单资源加载到弹出式菜单中 menu.getMenuInflater().inflate(R.menu.popup,menu.getMenu()); //为PopupMenu设置点击监听器 menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch(item.getItemId()){ case R.id.copy: Toast.makeText(MainActivity.this,"复制",Toast.LENGTH_SHORT).show(); break; case R.id.paste: Toast.makeText(MainActivity.this,"粘贴",Toast.LENGTH_SHORT).show(); break; } return false; } }); //最后要记得show一下 menu.show(); } });
    Processed: 0.010, SQL: 9