Android资源四:菜单Menu

参考:https://blog.csdn.net/CodingEnding/article/details/78609902?locationNum=9&fps=1

菜单的分类
菜单是Android应用中非常重要且常见的组成部分,主要可以分为三类:选项菜单、上下文菜单/上下文操作模式以及弹出菜单。它们的主要区别如下:

  • 选项菜单是一个应用的主菜单项,用于放置对应用产生全局影响的操作,如搜索/设置。
  • 弹出菜单以垂直列表形式显示一系列操作选项,一般由某一控件触发,弹出菜单将显示在对应控件的上方或下方。它适用于提供与特定内容相关的大量操作。
选项菜单

节点介绍
要定义Menu,我们首先需要在res文件夹下新建menu文件夹,它将用于存储与Menu相关的所有XML文件。我们可以使用 <menu>、<item>、<group>三种XML元素定义Menu,下面简单介绍一下它们:

  • <menu>是菜单项的容器。<menu>元素必须是该文件的根节点,并且能够包含一个或多个<item>和<group>元素。
  • <item>是菜单项,用于定义MenuItem,可以嵌套<menu>元素,以便创建子菜单。
  • <group>是<item>元素的不可见容器(可选)。可以使用它对菜单项进行分组,使一组菜单项共享可用性和可见性等属性。

其中,<item>是我们主要需要关注的元素,它的常见属性如下:

  • android:id:菜单项(MenuItem)的唯一标识
  • android:icon:菜单项的图标(可选)
  • android:title:菜单项的标题(必选)
  • android:showAsAction:指定菜单项的显示方式。常用的有ifRoom、never、always、withText,多个属性值之间可以使用|隔开。

showAsAction的差异如下所示:

  • always:菜单项永远不会被收纳到溢出菜单中,因此在菜单项过多的情况下可能超出菜单栏的显示范围。
  • ifRoom:在空间足够时,菜单项会显示在菜单栏中,否则收纳入溢出菜单中。
  • withText:无论菜单项是否定义了icon属性,都只会显示它的标题,而不会显示图标。使用这种方式的菜单项默认会被收纳入溢出菜单中。
  • never:菜单项永远只会出现在溢出菜单中。

代码实现:
1,布局文件

<?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/option_normal_1"
       android:icon="@drawable/aa"
       android:title="普通菜单1"
       app:showAsAction="ifRoom"/>

   <item android:id="@+id/option_normal_2"
       android:icon="@drawable/bb"
       android:title="普通菜单2"
       app:showAsAction="always"/>

   <item android:id="@+id/option_normal_3"
       android:icon="@drawable/cc"
       android:title="普通菜单3"
       app:showAsAction="withText|always"/>

   <item android:id="@+id/option_normal_4"
       android:title="普通菜单4"
       app:showAsAction="never"/>
</menu>

2,Java代码中:

public class MainActivity extends AppCompatActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

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

   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
       switch (item.getItemId()){
           case R.id.option_normal_1:
               Toast.makeText(MainActivity.this,1+"",Toast.LENGTH_SHORT).show();
               return true;
           case R.id.option_normal_2:
               Toast.makeText(MainActivity.this,2+"",Toast.LENGTH_SHORT).show();
               return true;
           case R.id.option_normal_3:
               Toast.makeText(MainActivity.this,3+"",Toast.LENGTH_SHORT).show();
               return true;
           case R.id.option_normal_4:
               Toast.makeText(MainActivity.this,4+"",Toast.LENGTH_SHORT).show();
               return true;
           default:
               return super.onOptionsItemSelected(item);
       }
   }
}
上下文菜单(弹出菜单)

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

要提供浮动上下文菜单,可以参照以下步骤:

  • 1,在Activity或Fragment中调用registerForContextMenu(View v)方法,注册需要和上下文菜单关联的View。如果将ListView或GridView作为参数传入,那么每个列表项将会有相同的浮动上下文菜单。
  • 2,在Activity或Fragment中重写onCreateContextMenu方法,加载Menu资源。
  • 3,在Activity或Fragment中重写onContextItemSelected方法,实现菜单项的点击逻辑

代码实现:
1,布局文件

<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>

2,Java代码

public class MainActivity extends AppCompatActivity {

   private ListView listView;
   private ArrayAdapter<String> adapter;
   private List<String> list;

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

       //初始化ListView
       listView = findViewById(R.id.list);
       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 = new ArrayList<>();
       for (int i = 0; i < 20; 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.test_menu, menu);
   }

   @Override
   public boolean onContextItemSelected(MenuItem item) {
       AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
       int pos=(int)listView.getAdapter().getItemId(menuInfo.position);
       switch (item.getItemId()) {
           case R.id.context_option_add:
               list.add(pos,"新增");
               adapter.notifyDataSetChanged();
               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:
               list.remove(pos);
               adapter.notifyDataSetChanged();
               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都调用完毕为止。**


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 应用程序中创建菜单(Menu)可以为用户提供更加丰富和便捷的交互方式。以下是创建 Android 菜单的步骤: 1. 在 res 目录下创建一个名为 menu 的文件夹。 2. 在 menu 文件夹中创建一个 XML 文件,该文件将定义菜单项( MenuItem )和菜单组( MenuGroup )。 3. 在 Activity 中重写 `onCreateOptionsMenu()` 方法,该方法会在创建菜单时被调用。在该方法中使用 `MenuInflater` 加载菜单资源文件并将菜单项添加到菜单中。 4. 重写 `onOptionsItemSelected()` 方法,该方法会在用户选择菜单项时被调用。在该方法中根据菜单项的 ID 执行相应的操作。 以下是一个简单的示例代码: 在 menu 文件夹中创建一个名为 menu_main.xml 的文件,该文件定义了一个名为 menu_main 的菜单组和两个菜单项: ``` <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:id="@+id/menu_main" android:checkableBehavior="single"> <item android:id="@+id/menu_item1" android:title="菜单项1" /> <item android:id="@+id/menu_item2" android:title="菜单项2" /> </group> </menu> ``` 在 Activity 中重写 `onCreateOptionsMenu()` 方法: ``` @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_main, menu); return true; } ``` 在 Activity 中重写 `onOptionsItemSelected()` 方法: ``` @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_item1: // 执行菜单项1的操作 return true; case R.id.menu_item2: // 执行菜单项2的操作 return true; default: return super.onOptionsItemSelected(item); } } ``` 这样就完成了 Android 菜单的创建。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值