Android Customer ActionProvider

来源:互联网 发布:c语言经典编程282例pdf 编辑:程序博客网 时间:2024/06/05 15:55

Android自定义ActionProvider.

到底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>

好了,看看效果:


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



1 1
原创粉丝点击