Android Customer ActionProvider

Android自定义ActionProvider.

到底ActionProvider长什么样子的呢?就是这样子的:

Android Customer ActionProvider


ActionProvider属于Actionbar的一部分,所以需要支持API 10及以下的就需要使用到Support Library,然而,每次使用Support包的时候,总是想杀人,总是没有直接支持的来得好.我研究了一个晚上+一个早上,才知道怎么用,我真是太笨了.下面以Support Library为准.

SDK中有一个及成绩ActionProvider的ShareActionProvider,这可以调用系统的分享组件.具体的使用在ApiDemos中有,这里也有 http://developer.android.com/guide/topics/ui/actionbar.html#ActionProvider,分享的就不再啰嗦.

下面讲一下自定义:

思路:在Actionbar显示一个按钮,点击按钮 之后跳出子菜单(Submenu).

首先创建一个类,继承与ActionProvider,重写 onCreateActionView(), onPrepareSubMenu()及 hasSubMenu()这三个方法,注意的是,onCreateActionView返回的是null,如果不返回null,是无法弹出子菜单的.onPrepareSubMenu()就是创建子菜单,根据自己的需要创建.hasSubMenu()必须返回true,也必须重写,因为默认是返回false的.自定义好ActionProvider之后,接下来就添加到菜单项中,我新建了一个main.xml菜单文件,

因为使用的Support Library,创建菜单的时候一定要写上:

xmlns:app="http://schemas.android.com/apk/res-auto"

而属性的定义:app:showAsAction="always" 及 app:actionProviderClass="org.robam.menutest.app.MainActivity$MyActionbarProvider",这里的前缀app和上面xmlns对应.应用内部类使用的是$符号,而不是"."号,所自定义的MyActionbarProvider也要是static的.

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /**
     * 初始化菜单.
     *
     * @param menu
     * @return
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    /**
     * xml引用内部类,这个类需要时静态的.
     */
    public static class MyActionbarProvider extends ActionProvider {

        Context mContext;

        /**
         * Creates a new instance.
         *
         * @param context Context for accessing resources.
         */
        public MyActionbarProvider(Context context) {
            super(context);
            mContext = context;
        }

        /**
         * @return 需要返回null, 才能弹出子菜单.
         */
        @Override
        public View onCreateActionView() {
            return null;
        }

        /**
         * 创建子菜单
         *
         * @param subMenu
         */
        @Override
        public void onPrepareSubMenu(SubMenu subMenu) {
            subMenu.clear();
            subMenu.add(0, 0, 0, R.string.menu1).setIcon(R.drawable.ic_launcher).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    Toast.makeText(mContext, "submenu 1 was clicked", Toast.LENGTH_SHORT).show();
                    return true;
                }
            });
            subMenu.add(0, 1, 1, R.string.menu2).setIcon(R.drawable.ic_launcher).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    Toast.makeText(mContext, "submenu 2 was clicked", Toast.LENGTH_SHORT).show();
                    return true;
                }
            });
        }

        /**
         * @return 返回true代表有子菜单
         */
        @Override
        public boolean hasSubMenu() {
            return true;
        }
    }

}

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="org.robam.menutest.app.MainActivity">
    <item
        android:id="@+id/menu_item_share_action_provider_action_bar"
        app:showAsAction="always"
        android:title="hehe"
        android:icon="@drawable/ic_launcher"
        app:actionProviderClass="org.robam.menutest.app.MainActivity$MyActionbarProvider" />
</menu>

好了,看看效果:

Android Customer ActionProvider

但是,最终在API 10及以下的效果是这样的:

Android Customer ActionProvider

Android Customer ActionProvider,布布扣,bubuko.com

Android Customer ActionProvider

上一篇:android音乐播放器;activity生命周期;模拟器用快照(snapshot)没声音;win7要用管理员身份运行adt,才能打开模拟器sdcard;


下一篇:Android编码规范