Actionbarsherlock Demo 淺析 :Action Providers

此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使用了默認的建立方法。而點擊他們兩個菜單項都完成了進入系統設置頁面的功能。

相關文章
相關標籤/搜索