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