Android ActionBar全然解析,使用官方推荐的最佳导航栏(下)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/25466665
本篇文章主要内容来自于Android Doc。我翻译之后又做了些加工,英文好的朋友也能够直接去读原文。
http://developer.android.com/guide/topics/ui/actionbar.html
限于篇幅的原因,在上篇文章中我们仅仅学习了ActionBar基础部分的知识,那么本篇文章我们将接着上一章的内容继续学习,探究一下ActionBar更加高级的知识。假设你还没有看过前面一篇文章的话。建议先去阅读Android ActionBar全然解析,使用官方推荐的最佳导航栏(上)。
加入Action Provider
和Action View有点相似,Action Provider也能够将一个Actionbutton替换成一个自己定义的布局。但不同的是,Action Provider能够全然控制事件的全部行为。而且还能够在点击的时候显示子菜单。
为了加入一个Action Provider。我们须要在<item>标签中指定一个actionViewClass属性,在里面填入Action Provider的完整类名。
我们能够通过继承ActionProvider类的方式来创建一个自己的Action Provider,同一时候。Android也提供好了几个内置的Action Provider,比方说ShareActionProvider。
因为每一个Action Provider都能够自由地控制事件响应,所以它们不须要在onOptionsItemSelected()方法中再去监听点击事件。而是应该在onPerformDefaultAction()方法中去执行对应的逻辑。
那么我们就先来看一下ShareActionProvider的简单使用方法吧,编辑menu资源文件,在里面加入ShareActionProvider的声明,例如以下所看到的:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.actionbartest.MainActivity" > <item android:id="@+id/action_share" android:actionProviderClass="android.widget.ShareActionProvider" android:showAsAction="ifRoom" android:title="@string/action_share" /> ...... </menu>注意。ShareActionProvider会自己处理它的显示和事件,但我们仍然要记得给它加入一个title,以防止它会在overflow其中出现。
接着剩下的事情就是通过Intent来定义出你想分享哪些东西了。我们仅仅须要在onCreateOptionsMenu()中调用MenuItem的getActionProvider()方法来得到该ShareActionProvider对象,再通过setShareIntent()方法去选择构建出什么样的一个Intent就能够了。
代码例如以下所看到的:
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); MenuItem shareItem = menu.findItem(R.id.action_share); 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; }
能够看到。这里我们通过getDefaultIntent()方法来构建了一个Intent,该Intent表示会将全部能够共享图片的程度都列出来。
又一次执行一下程序,效果例如以下图所看到的:
细心的你一定观察到了,这个ShareActionProvider点击之后是能够展开的,有点相似于overflow的效果。这就是Action Provider的子菜单。除了使用ShareActionProvider之外,我们也能够自己定义一个Action Provider,比方说假设想要建立一个拥有两项子菜单的Action Provider。就能够这样写:
public class MyActionProvider extends ActionProvider { public MyActionProvider(Context context) { super(context); } @Override public View onCreateActionView() { return null; } @Override public void onPrepareSubMenu(SubMenu subMenu) { subMenu.clear(); subMenu.add("sub item 1").setIcon(R.drawable.ic_launcher) .setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { return true; } }); subMenu.add("sub item 2").setIcon(R.drawable.ic_launcher) .setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { return false; } }); } @Override public boolean hasSubMenu() { return true; } }这里我们新建了一个MyActionProvider继承自ActionProvider,为了表示这个Action Provider是有子菜单的,须要重写hasSubMenu()方法并返回true,然后在onPrepareSubMenu通过调用SubMenu的add()方法加入子菜单。
接着改动menu资源。在里面加入MyActionProvider的声明:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.actionbartest.MainActivity" > <item android:id="@+id/action_share" android:actionProviderClass="com.example.actionbartest.MyActionProvider" android:icon="@drawable/ic_launcher" android:showAsAction="ifRoom" android:title=&quo