Actionbarsherlock Demo 浅析 :Action Providers

本文展示了如何使用ActionProvider在Android的Actionbar中实现自定义布局,包括如何在XML文件中定义和在Activity中实现。通过示例代码,详细介绍了如何将Menu与系统应用关联,以及如何在不同的Actionbar视图中使用ActionProvider。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此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使用了默认的创建方法。而点击他们两个菜单项都完成了进入系统设置页面的功能。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值