此Demo的功能:展現如何應用ActionProvider來在Action bar使用自定義的佈局。特別是將Menu與系統應用關聯在了一塊兒。android
Activity中的代碼:ide
@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.xmlspa
<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"/>指定了操做提供器。code
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類--------------orm
介紹:ActionProvider能夠在單一的組件上定義豐富的菜單交互項,它能夠生成可用的Action視圖,可以動態的填充子菜單和處理默認菜單項的調用。ActionProvider能夠被菜單項隨意的指定,以後它將負責替換以前出如今Actionbar上的小按鈕,並建立屬於它本身的Action視圖。可是,若是在相似於「溢出菜單」中不能建立帶有視圖的子菜單,那麼它將執行默認的建立操做。xml
它有兩種設置方法:一、menuItem.setActionProvider(actionProvider)blog
二、在XML文件中定義。get
<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類。it
--------->如今能夠解釋爲何在settings_action_provider.xml定義了兩個Item。由於第一個Item的showasaction是ifroom,表明若是有足夠的空間,這個值會使菜單項顯示在Action Bar上,給它指定了ActionProvider以後,他的按鈕會被替換掉。而第二個Item的showasaction是never,也就是不會在ActionBar上顯示,它會出如今「溢出」菜單中,而在「溢出」菜單中是不容許使用Action View的,因此ActionProvider使用了默認的建立方法。而點擊他們兩個菜單項都完成了進入系統設置頁面的功能。