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
posted @ 2017-07-31 17:15  jzdwajue  阅读(182)  评论(0编辑  收藏  举报