http://developer.android.com/training/basics/actionbar/adding-buttons.html
摘要:
1 在res/menu添加
2 在activity的onCreateOptionsMenu方法装载图标
3 在activity的onOptionsItemSelected方法实现对action的响应
开发者可以在action栏中为自己的应用软件添加一系列在运行上下文环境中最常用到的快捷按钮,这些在action栏中以图标或者文字形式呈现的元素即被称为action按钮。其他一些由于action栏空间或者重要性更低的一些功能则被隐藏在action栈内。
图1 包含search按钮和action栈(通常包含一些额外的操作按钮)的action栏
所有的action按钮和其他在action栈内包含的条目定义在res/menu下的XML文件中,因此为了给action栏添加action必须首先在该目录下创建一个XML文件。
对于每一个需要添加在action栏中的条目,都需要创建一个对应的
res/menu/main_activity_actions.xml
上面的代码段声明了search按钮在action栏有足够空间的时候显示为action按钮,而setting按钮只包含在action栈中。默认情况下,所有的按钮都包含在action栈中,但是通过语言显式申明则更能体会开发者的设计意图。
icon属性需要指定一个image的资源ID,跟在@drawable/后面的名称必须与在res/drawable路径下保存的一个bitmap图形文件相对应。例如,"@drawable/ic_action_search"指向ic_action_search.png。类似的,title属性使用了一个string资源,该资源在res/value路径下的一个xml文件中定义(参见创建一个简单的用户界面)
注意:为应用软件创建图表或者其他位图文件时,开发者最好能够为不同的屏幕分辨率提供不同的图形文件以达到最佳的显示效果,相关信息参见支持屏幕差异。
如果应用软件使用的是兼容Android 2.1版本的支撑库,showAsAction属性则不被android::命名空间支持,而是由支撑库提供,因此开发者必须自行定义自有的XML命名空间,并将此命名空间作为该属性的前缀(虽然定制的XML命名空间可以使用任意名称,仅在明确申明的文件范围内可见,但是推荐开发者基于应用软件名对定制命名空间命名)。
res/menu/main_activity_actions.xml
将目录条目添加到action栏,需要为activity实现回调函数onCreateOptionsMenu(),该函数将菜单资源装载到指定的菜单对象,例如
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu items for use in the action bar MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_activity_actions, menu); return super.onCreateOptionsMenu(menu); }
当用户点击action按钮或者action栈中的某一条目,系统将会调用activity的onOptionsItemSelected()回调函数。在该函数实现中,通过参数MenuItem的getItemId()方法可以确定当前被按下的是哪个条目——其返回值与之前声明的
@Override public boolean onOptionsItemSelected(MenuItem item) { // Handle presses on the action bar items switch (item.getItemId()) { case R.id.action_search: openSearch(); return true; case R.id.action_settings: openSettings(); return true; default: return super.onOptionsItemSelected(item); } }
所有非应用软件主界面的用户界面(非“主页”activity)都应该为用户在action栏提供Up按钮,通过该按钮用户能够快速返回到应用软件的上一级界面。
如果应用软件运行在Android 4.1(API Level 16)或者更高版本,或者使用了支撑库的ActionBarActivity,实现Up按钮的快速导航功能仅需要在清单(manifest)文件中声明对应activity的上级activity,然后在action栏使能Up按钮即可。
例如,下面代码展示如何在清单文件中声明一个activity的上级activity
... >
...
android:name="com.example.myfirstapp.MainActivity" ...>
...
android:name="com.example.myfirstapp.DisplayMessageActivity"
android:label="@string/title_activity_display_message"
android:parentActivityName="com.example.myfirstapp.MainActivity" >
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.myfirstapp.MainActivity" />
接下来,通过调用setDisplayHomeAsUpEnabled()方法使能Up按钮。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_displaymessage); getSupportActionBar().setDisplayHomeAsUpEnabled(true); // If your minSdkVersion is 11 or higher, instead use: // getActionBar().setDisplayHomeAsUpEnabled(true); }
这样,系统就知道MainActivity是DisplayMessageActivity的上级activity,当用户按下Up按钮,系统自动将用户导航到MainAcitivy的显示界面,而不需要开发者额外地处理Up按钮的事件。更多关于up导航的信息参见提供Up导航。