Actionbarsherlock Demo 浅析 :Action Providers

此Demo的功能:展示如何应用ActionProvider来在Action bar使用自定义的布局。特别是将Menu与系统应用关联在了一起。

Activity中的代码:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getSupportMenuInflater().inflate(R.menu.settings_action_provider, menu);
        return true;
    }

该方法是为menu添加menu子菜单。

getSupportMenuInflater().inflate(R.menu.settings_action_provider, menu);

res文件夹下的menu菜单里的settings_action_provider.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/menu_item_action_provider_action_bar"
        android:showAsAction="ifRoom"
        android:title="Settings"
        android:actionProviderClass="com.actionbarsherlock.sample.demos.ActionProviders$SettingsActionProvider"/>

    <item android:id="@+id/menu_item_action_provider_overflow"
        android:showAsAction="never"
        android:title="Settings"
        android:actionProviderClass="com.actionbarsherlock.sample.demos.ActionProviders$SettingsActionProvider"/>

</menu>

该xml文件中定义了两个子菜单。其中android:actionProviderClass="com.actionbarsherlock.sample.demos.ActionProviders$SettingsActionProvider"/>指定了操作提供器。

public static class SettingsActionProvider extends ActionProvider {

        /** An intent for launching the system settings. */
        private static final Intent sSettingsIntent = new Intent(Settings.ACTION_SETTINGS);

        /** Context for accessing resources. */
        private final Context mContext;

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

        //创建Actionbar视图,actionprovider这个类的功能之一就是替换原有的布局。
        @Override
        public View onCreateActionView() {
            // // 填充用于展示在Actionbar上Action视图
           <span style="color:#ff6666;"> LayoutInflater layoutInflater = LayoutInflater.from(mContext);</span>
           <span style="color:#ff6666;"> View view = layoutInflater.inflate(R.layout.settings_action_provider, null);</span>
            ImageButton button = (ImageButton) view.findViewById(R.id.button);
            // Attach a click listener for launching the system settings.
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mContext.startActivity(sSettingsIntent);
                }
            });
            return view;
        }

        @Override
        public boolean onPerformDefaultAction() {
            //如果在“溢出”菜单中主菜单被点击了但是主Activity却没有处理的时候该方法会被触发。
            mContext.startActivity(sSettingsIntent);
            return true;
        }
    }

-------------ActionProvider类--------------

介绍:ActionProvider可以在单一的组件上定义丰富的菜单交互项,它可以生成可用的Action视图,能够动态的填充子菜单和处理默认菜单项的调用。ActionProvider可以被菜单项随意的指定,之后它将负责替换之前出现在Actionbar上的小按钮,并创建属于它自己的Action视图。但是,如果在类似于“溢出菜单”中不能创建带有视图的子菜单,那么它将执行默认的创建操作。

它有两种设置方法:1、menuItem.setActionProvider(actionProvider)

2、在XML文件中定义。

<item android:id="@+id/my_menu_item"
android:title="Title"
android:icon="@drawable/my_menu_item_icon"
android:showAsAction="ifRoom"
android:actionProviderClass="foo.bar.SomeActionProvider" />

注意:需要在Activity或者包下面创建属于自己的ActionProvider类。

--------->现在可以解释为什么在settings_action_provider.xml定义了两个Item。因为第一个Item的showasaction是ifroom,代表如果有足够的空间,这个值会使菜单项显示在Action Bar上,给它指定了ActionProvider之后,他的按钮会被替换掉。而第二个Item的showasaction是never,也就是不会在ActionBar上显示,它会出现在“溢出”菜单中,而在“溢出”菜单中是不允许使用Action View的,所以ActionProvider使用了默认的创建方法。而点击他们两个菜单项都完成了进入系统设置页面的功能。

posted @ 2015-08-05 15:06  黑泡man  阅读(157)  评论(0编辑  收藏  举报