Android 建立Menu选单&&onOptionsItemSelected

本文介绍了一个简单的Android应用如何处理菜单选项,包括定义菜单项ID、创建菜单及响应菜单选择等过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/** Menu有命令被选择时,会调用此方法 */ 

    @Override 

    public boolean onOptionsItemSelected(MenuItem item) {  

        switch (item.getItemId()) {  

        case ADD_ID:  

            setTitle("添加");// title设置为"添加"  

            break;  

 

        case DELETE_ID:  

            setTitle("删除");// title设置为"删除"  

            break;  

 

        case EXIT_ID:  

            finish();// 退出程序  

            break;  

        }  

        // 返回false允许正常的菜单处理资源,若返回true,则直接在此毁灭它  

        return super.onOptionsItemSelected(item);  

    }  

 

} 

package com.misoo;

 

import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

 

public class ex01 extends Activity {

         /** 给定各菜单项对应ID值,以区别之,能保证这些值不同就行了 */

         public static final int ADD_ID = Menu.FIRST;// 添加命令对应ID

         public static final int DELETE_ID = Menu.FIRST + 1;// 删除命令对应ID

         public static final int EXIT_ID = Menu.FIRST + 2;// 退出命令对应ID

 

         /** activity首次被创建时被调用 */

         @Override

         public void onCreate(Bundle savedInstanceState) {

                   super.onCreate(savedInstanceState);

                   setContentView(R.layout.main);// 根据main.xml的布局来显示

         }

 

         /** 只有当Menu菜单首次被显示时会调用此方法 */

         @Override

         public boolean onCreateOptionsMenu(Menu menu) {

                   boolean b = super.onCreateOptionsMenu(menu);

                   /**

                    * menu.add(int groupId, int itemId, int order, CharSequence title)

                    * groupId为组ID,这里用不到,所以设置成Menu.NONE

                    * itemId为项ID,当命令被点击时,要区别点击的命令,所以设置以不同的ID

                    * order为排列次序,值越小排的越前(不能为负数),这里按添加顺序排,所以也设置成Menu.NONE

                    * title为要显示的命令名称,这里是根据res/values/strings.xmlname名称去取相应的value

                    * 估计这样处理是为了日后若要更改这些值,就直接在XML里修改,可以不必改动代码

                    */

                   menu.add(Menu.NONE, ADD_ID, Menu.NONE, R.string.menu_add);

                   menu.add(Menu.NONE, DELETE_ID, Menu.NONE, R.string.menu_delete);

                   menu.add(Menu.NONE, EXIT_ID, Menu.NONE, R.string.menu_exit);

                   return b;// 如果返回值不为true,Menu菜单将不会显示

         }

 

         /** 当每次Menu显示时,会调用此方法 此例中没用到*/

         @Override

         public boolean onPrepareOptionsMenu(Menu menu) {

                   return super.onPrepareOptionsMenu(menu);

         }

 

         /** 当每次Menu关闭时,会调用此方法 此例中没用到*/

         @Override

         public void onOptionsMenuClosed(Menu menu) {

                   super.onOptionsMenuClosed(menu);

         }

 

         /** Menu有命令被选择时,会调用此方法 */

         @Override

         public boolean onOptionsItemSelected(MenuItem item) {

                   switch (item.getItemId()) {

                   case ADD_ID:

                            setTitle("添加");// title设置为"添加"

                            break;

 

                   case DELETE_ID:

                            setTitle("删除");// title设置为"删除"

                            break;

 

                   case EXIT_ID:

                            finish();// 退出程序

                            break;

                   }

                   // 返回false允许正常的菜单处理资源,若返回true,则直接在此毁灭它

                   return super.onOptionsItemSelected(item);

         }

 

}

 

 下边为res/values/string.xml

 

view plaincopy to clipboardprint?

<?xml version="1.0" encoding="utf-8"?> 

<resources> 

    <string name="hello">Hello World, ex01!</string> 

    <string name="app_name">ex01</string> 

    <string name="menu_add">Add Item</string> 

    <string name="menu_delete">Del Item</string> 

    <string name="menu_exit">Exit</string> 

</resources>   

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/kf156/archive/2009/08/12/4436594.aspx

 

 

menu.add的方法中的参数:


第一个int类型的group ID参数,代表的是组概念,你可以将几个菜单项归为一组,以便更好的以组的方式管理你的菜单按钮。可以用到的方法有:
removeGroup(id)
setGroupCheckable(id, checkable, exclusive)
setGroupEnabled(id,boolean enabled)
setGroupVisible(id,visible)
个人认为,当你需要在不同场合下显示不同的menu的时候,合理使用这个参数将更为有效的处理菜单的显示。否则一般情况下都归为一组。
第二个int类型的item ID参数,代表的是项目编号。这个参数非常重要,一个item ID对应一个Menu中的选项。在后面使用菜单的时候,就是靠这个item ID来判断,你选中的是哪个选项。
第三个int类型的order ID参数,代表的是菜单项的显示顺序。默认是0,表示菜单的显示顺序就是按照add的顺序来显示。
第四个String类型的title参数,表示选项中显示的文字。
再看看setIcon方法,就是为菜单添加图标显示,使用用资源文件。

### 使用和配置 Menu 和 Toolbar 的方法 在 Android Studio 中,`Toolbar` 是一种灵活的组件,能够替代传统的 `ActionBar` 并提供更丰富的功能。通过结合 `Menu`,开发者可以在工具栏上展示各种操作选项。 #### 1. 声明 Toolbar 在布局文件中声明一个 `Toolbar` 组件作为应用的主要导航区域[^1]: ```xml <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:titleTextColor="@android:color/white" app:title="App Title"/> ``` 此代码片段展示了如何创建一个基本的 `Toolbar`,其中设置了宽度、高度以及背景颜色等属性[^3]。 #### 2. 配置 Menu 资源文件 为了向 `Toolbar` 添加菜单项,需先定义一个 XML 文件来描述这些项目的内容[^2]。通常会放在 `res/menu/main_menu.xml` 下面: ```xml <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Example of a simple action button --> <item android:id="@+id/action_search" android:icon="@drawable/ic_search" android:title="Search" android:orderInCategory="100" android:showAsAction="ifRoom|withText"/> <!-- Another example with overflow options --> <item android:id="@+id/action_settings" android:title="Settings" android:orderInCategory="101" android:showAsAction="never"/> </menu> ``` 上述例子包含了两个不同的菜单条目:一个是搜索按钮(如果空间允许则显示),另一个是设置链接,默认情况下只会在溢出菜单中可见。 #### 3. 初始化 Toolbar 及绑定 Menu 要在活动中启用自定义的 `Toolbar` 并加载相应的菜单资源,需要修改活动类中的 `onCreate()` 方法[^4]: ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar myToolbar = findViewById(R.id.toolbar); // Find the toolbar view inside the activity layout. setSupportActionBar(myToolbar); // Set it as an application-level bar. getSupportActionBar().setDisplayHomeAsUpEnabled(true); // Optional, adds back arrow to toolbar. } ``` 接着重写 `onCreateOptionsMenu(Menu)` 函数以填充菜单数据到视图当中去: ```java @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_menu, menu); // Inflate our custom defined menu into this one. return true; } // Handle clicks on items within your menu here: @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_search: openSearch(); return true; case R.id.action_settings: openSettings(); return true; default: return super.onOptionsItemSelected(item); } } ``` 以上实现了当用户点击某个特定菜单项时触发对应的动作处理逻辑。 #### 4. 上下文菜单与 PopupMenu 实现方式 除了常规的操作栏外,还可以利用 `PopupMenu` 或者其他形式实现更加复杂的交互体验。例如,在某控件旁边弹出快捷命令列表: ```java private void showPopup(View v){ PopupMenu popup = new PopupMenu(this, v); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.popup_menu, popup.getMenu()); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { Toast.makeText(MainActivity.this,"You Clicked : "+item.getTitle(),Toast.LENGTH_SHORT).show(); return true; } }); popup.show(); } ``` 这段脚本演示了怎样基于指定位置生成浮动式的子级选单结构。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值