本篇将开始Android开发实践 界面编程(下)的旅程。
ActionBar是Android3.0的重要更新之一,ActionBar提供了如下功能:
显示选项菜单的菜单项(将菜单项显示成Action Item);
使用App图标作为返回Home主屏或向上的导航操作;
提供交互式View作为Action View;
提供基于Tab的导航方式,可用于切换多个Fragment;
提供基于下拉的导航方式。
ActionBar actionBar = getActionBar(); // 只有当主题没有关闭ActionBar时,该代码才能返回ActionBar actionBar.show(); // 显示ActionBar actionBar.hide(); // 隐藏ActionBar
ActionBar可以将选项菜单显示成Action Item,从Android3.0开始MenuItem新增了setShowAsAction(int actionEnum)方法,该方法设置是否将菜单项作为ActionItem显示在ActionBar上,该方法支持如下参数值:
SHOW_AS_ACTION_NEVER 不将该MenuItem显示在ActionBar上 SHOW_AS_ACTION_IF_ROOM 当ActionBar位置足够时才显示MenuItem SHOW_AS_ACTION_ALWAYS 总是将该MenuItem显示在ActionBar上 SHOW_AS_ACTION_WITH_TEXT 将该MenuItem显示在ActionBar上,并显示该菜单项的文本 SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW 将该Action View折叠成普通菜单项在实际项目中推荐使用XML资源文件来定义菜单
android:showAsAction=""下来我们简单使用ActionBar实现仿微信弹出式菜单
public class ActionItemTest extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflator = new MenuInflater(this); // 状态R.menu.context对应的菜单,并添加到menu中 inflator.inflate(R.menu.my_menu, menu); return super.onCreateOptionsMenu(menu); } @Override /** * 选项菜单的菜单项被单击后的回调方法 */ public boolean onOptionsItemSelected(MenuItem mi) { if(mi.isCheckable()) { mi.setChecked(true); } // 判断单击的是哪个菜单项,并针对性的作出响应 switch (mi.getItemId()) { case R.id.item1: Toast.makeText(getApplicationContext(), "您单击了发起群聊", 0).show(); mi.setChecked(true);break; case R.id.item2: mi.setChecked(true);break; case R.id.item3: mi.setChecked(true);break; case R.id.item4: mi.setChecked(true);break; case R.id.plain_item: Toast.makeText(getApplicationContext(), "您单击了普通菜单项", 0).show();break; } return true; } }
其中res/menu/my_menu.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 定义一个普通菜单项 --> <item android:id="@+id/plain_item" android:showAsAction="always|withText" android:title="@string/plain_item"></item> <item android:title="点击我" android:showAsAction="always" > <menu> <!-- 定义一组允许复选的菜单项 --> <group> <!-- 定义3个菜单项 --> <item android:id="@+id/item1" android:title="发起群聊"/> <item android:id="@+id/item2" android:title="添加朋友"/> <item android:id="@+id/item3" android:title="扫一扫"/> <item android:id="@+id/item4" android:title="收付款"/> </group> </menu> </item> </menu>styles.xml如下
<resources> <!-- Application theme. --> <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"></style> </resources>运行后效果图如下:
首先在onCreate方法中为ActionBar设置属性,然后在回调方法onOptionsItemSelected中实现返回功能,代码如下:
public class ActionHomeTest extends Activity { ActionBar actionBar; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); actionBar = getActionBar(); actionBar.setDisplayShowHomeEnabled(true); // 设置是否显示应用程序图标 actionBar.setHomeButtonEnabled(true); // 将应用程序图标设置为可点击的按钮 actionBar.setDisplayHomeAsUpEnabled(true); // 将应用程序图标设置为可点击的按钮,并在图标上添加向左箭头 } @Override // 选项菜单的菜单项被单击后的回调方法 public boolean onOptionsItemSelected(MenuItem mi) { if(mi.isCheckable()) { mi.setChecked(true); } // 判断单击的是哪个菜单项,并针对性的作出响应。 switch (mi.getItemId()) { case android.R.id.home: // 创建启动FirstActivity的Intent Intent intent = new Intent(this, MainActivity.class); // 添加额外的Flag,将Activity栈中处于FirstActivity之上的Activity弹出 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // 启动intent对应的Activity startActivity(intent); break; } return true; } }
ActionBar上除了可以显示普通的Action Item之外,还可以通过添加Action View显示普通的UI组件,两种添加方式如下:
定义Action Item时使用android:actionLayout属性指定Action View对应的视图资源。
ActionViewTest.java
public class ActionViewTest extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }res\menu\main.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/search" android:actionViewClass="android.widget.SearchView" android:orderInCategory="100" android:showAsAction="always" android:title="@string/menu_settings"/> <item android:id="@+id/progress" android:actionLayout="@layout/clock" android:orderInCategory="100" android:showAsAction="always" android:title="@string/menu_settings"/> </menu>res\layout\clock.xml
<?xml version="1.0" encoding="utf-8"?> <AnalogClock xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" />
注意:ActionBar的标题可在AndroidManifest.xml中自定义,如下
<activity android:name=".ActionViewTest" android:label="自定义标题"> </activity>效果图如下:
实现思路如下:
先调用ActionBar的setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)方法设置使用Tab导航方式;然后调用ActionBar的addTab()方法添加多个Tab标签,并为每个Tab标签添加事件监听器。实际开发ActionBar通常会结合Fragment来实现Tab导航。
具体实现请点击下面链接下载该项目源码查看。
效果图:
项目源码,点击下载
Toast(吐司)、CalendarView(日历视图)、DataPicker(日期选择器)、TimePicker(时间选择器)、NumberPicker(数值选择器)、SearchView(搜索框)、TabHost(选项卡)、ScrollView(滚动视图)、Notification(显示在手机状态栏的通知)