标题栏menu就是指下图中红框里面的菜单按钮。
标题栏上所有的按钮或者其他元素都定义在xml文件里面,这些文件资源称为menu resource。要在标题栏添加按钮,需要在项目的/res/menu/路径下创建xml文件。
假设给主界面MainActivity的标题栏添加按钮,在/res/menu/下新建一个main.xml文件(如果有就不用建了),在main.xml中输入如下代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.lidi.helloworld.MainActivity" > <item android:id="@+id/action_settings" android:icon="@drawable/ic_launcher" android:orderInCategory="100" android:showAsAction="ifRoom" android:title="@string/action_settings"/> </menu>
--------------------------------------------------------下面是上面的代码的一些解释,可以跳过----------------------------------------------------------
一个item就是一个按钮。
android:id="@+id/action_settings"为这个按钮添加id。
android:icon="@drawable/ic_launcher"为这个按钮添加图标;
图标这 么设置的话,则一定要保证/res/drawable/下面有ic_launcher.png这个图片,/res/drawable/ic_launcher.png是程序启动用的图标,我现在项目里没有添加其它图标,所以暂时用这个图标。
android:orderInCategory="100"设置按钮的优先级,空间不够时优先显示值大的按钮(优先显示值大还是值小我目前还不太清楚)。
android:showAsAction="ifRoom"表示如果控件足够才显示。这个属性有5个值,描述分别如下:
ifRoom | 剩余空间足够时才显示,不够时将隐藏在溢出列表中 |
never | 从不在标题栏显示,隐藏在溢出列表中并且显示时只显示文本,所以定义item的时候最好带上android:title属性。 |
always | 无论是否溢出,总会显示。 |
withText | 图标和文本同时在标题栏显示,空间不足时文本可能显示不全。 |
collapseActionView | 同一menu下其它按钮折叠到这个按钮上,用户点击这个时所有按钮才展开。(我是这么理解的,具体是不是没试过o(╯□╰)o)。 |
android:title="@string/action_settings" 设置按钮的文本。
注意:在比较老的安卓系统(比如Android 2.1)里面,android:showAsAction这样是不行的,showAsAction是由Surport Library提供的,所以你需要自定义XML namespace,并用这个namespace作为showAsAction的前缀,一般以项目名称给XML namespace命名,但也可以随便命名,例如HelloWorld的项目就用helloworld为XML namespace命名,像下面加粗部分:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:helloworld="http://schemas.android.com/apk/res-auto" > <!-- Search, should appear as action button --> <item android:id="@+id/action_search"
android:icon="@drawable/ic_action_search"
android:title="@string/action_search"
helloworld:showAsAction="ifRoom" /> ... </menu>
-----------------------------------------------------------解释完毕,后面是剩下的步骤-----------------------------------------------------------
然后,重写MainActivity的onCreateOptionsMenu函数,引用main.xml文件,将按钮添加到标题栏。在MainActivity.java中添加如下代码(已经存在该部分代码的话请对照修改):
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu items for use in the action bar MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); return super.onCreateOptionsMenu(menu); }
然后给按钮添加功能。用户点击item的时候,系统会调用该Activity的onOptionsItemSelected函数,所以我接下来要实现这个函数来给按钮添加功能。这个函数需要判断用户点击了哪个按钮,我们可以用getItemId()函数来获取被点击的item的id,并根据id的不同执行不同的命令。onOptionsItemSelected函数代码如下:
@Override public boolean onOptionsItemSelected(MenuItem item) { // Handle presses on the action bar items switch (item.getItemId()) { case R.id.action_settings: //省略执行功能的代码 return true; default: return super.onOptionsItemSelected(item); } }
由于我只添加了一个item,其id是action_settings,所以我这里只写一个case,如果有多个item,就得写多个case,比如假如我有在main.xml里面添加了一个item,设置其id为action_search,我就需要在上面的switch块里面添加下面这样一个case:
case R.id.action_search: //省去执行功能的代码 return true;
到这里,给标题栏添加按钮,并给按钮添加点击事件就完成了。