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