在上一篇文章中,我们讨论了如何将发出短信存在手机数据库,今天,我们将给出导航栏ActionBar的实现方法,先来直观地看一下ActionBar的效果吧,下图中红框圈出部分即为ActionBar。
图中用红线框出的部分即为导航栏,ActionBar是在Android 3.0以后引入的,对应的API level在11及以上,在这里我们也只讨论API level ≥ 11的情况,对于level 11以下的版本大家可以参考官方文档(点击此处链接)。
本次的导航栏添加在短信会话记录列表界面中,在ShowSessionMessagesActivity中添加代码。首先,需要在工程res/menu目录下创建定义ActionBar中需要显示为功能按钮的项目,如分享,删除,设置等,新建show_session_messages.xml文件,源码如下:
文件分别定义了共享,删除和设置三个功能按钮,其中分享按钮直接使用了系统提供的ShareAcitonProvider类,其中item的id属性将会在onOptionsItemSelected()方法中用到,根据被点击的按钮的id执行对应的操作;icon属性定义了当按钮显示在导航栏上时的背景图标;showAsAction定义了按钮的显示位置,其值有三个,“always”表示该按钮图标总是显示在导航栏上,“never”表示将按钮折叠到overflow中,此时点击overflow时将显示该按钮的title,而不显示其图标,而“ifRoom表示”当空间足够时在导航栏显示该按钮,否则将其折叠至overflow按钮中;title定义了按钮的文字表示,当进入overflow时将看到其中包含的按钮的title组成的列表。
接着,需要在ShowSessionMessagesActivity中定义onCreateOptionsMenu()方法,加载上面新建的xml文件。
public boolean onCreateOptionsMenu(Menu menu) {
// 加载定义功能选项的xml文件
getMenuInflater().inflate(R.menu.show_session_messages, menu);
MenuItem shareItem = menu.findItem(R.id.show_session_messages_action_share);
//设置ActionBar共享按钮
ShareActionProvider provider = (ShareActionProvider) shareItem.getActionProvider();
provider.setShareIntent(getDefaultIntent());
return super.onCreateOptionsMenu(menu);
}
//设置点击共享按钮时列出所有可以共享图片的应用
private Intent getDefaultIntent() {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
return intent;
}
然后,
在ShowSessionMessagesActivity中增加onOptionsItemSelected()方法,定义当点击不同按钮时所执行的操作。
//设置当ActionBar menu中相关item被选中时执行的动作
public boolean onOptionsItemSelected(MenuItem item) {
// Handle presses on the action bar items
switch (item.getItemId()) {
case R.id.show_session_messages_action_delete:
//删除短信会话
deleteSmsByThreadId(threadId);
Intent intent = new Intent();
intent.setClass(this,MainActivity.class);
this.startActivity(intent);
return true;
case R.id.show_session_messages_action_settings:
Toast.makeText(this, "Settings selected", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
当点击共享图标时,将弹出共享短信的应用列表,如下所示:
因为在show_session_messages.xml文件中,将设置选项的showAsAction属性设为“never”,所以设置按钮总是被隐藏到overflow按钮中,需要点击overflow按钮才会看到设置选项,如下:
当点击“设置”时,将弹出提示框显示Settings selected的字样。
当点击删除按钮时,根据上面的定义,将执行deleteSmsByThreadId方法,根据本短信会话id将此会话包含的所有短信全部删除,并跳转到短信应用的主界面,显示删除后新的短信会话列表,deleteSmsByThreadId方法定义如下。
//根据会话ID删除短信会话
public void deleteSmsByThreadId(String threadId) {
Cursor cursor = null;
try {
// Delete SMS
resolver.delete(Uri.parse("content://sms/conversations/" + Long.parseLong(threadId)), null, null);
Log.d("deleteSMS", "threadId:: "+threadId);
} catch (Exception e) {
// TODO: handle exception
Log.d("deleteSMS", "Exception:: " + e);
}
}
左图为一开始的短信主界面,点击进入与Tony的短信会话记录界面,如中间图所示,选择删除按钮,将删除当前短信会话并跳转到短信主界面,此时可以在右图中看到,Tony的短信会话已经从短信会话列表中删除了。
另外,对于overflow按钮不显示的情况,可参考郭霖大神的这篇文章 ,关于共享按钮的设置方法,参考了其另一篇文章。
最后,来看一下导航栏的向上导航按钮的实现吧。
首先,需要在AndroidManifest.xml中配置当前Activity的父Activity,此处配置特定联系人的短信会话记录页面的上一级页面为短信主界面,即所有联系人的短信会话列表,如下所示:
android:parentActivityName="com.example.mymessageproject.MainActivity">
其中,对于Android4.1以上版本,直接使用parentActivityName属性就可以制定上一级Activity对象,meta-data声明是为了兼容更低版本。
然后,在ShowSessionMessagesActivity的onCreate方法中,获取ActionBar对象,并激活向上导航按钮,就大功告成啦。
//获取ActionBar对象
actionBar = getActionBar();
//激活返回父一级Activity的导航按钮
actionBar.setDisplayHomeAsUpEnabled(true);
左图中联系人头像左侧的箭头按钮即为返回按钮,点击该按钮后将返回到右图所示的界面。