Actionbar實現子菜單的幾種方式

第一種方式是使用ActionProvider。定義一個以下代碼的ActionBarhtml

public class PopupMenuActionProvider extends ActionProvider {

    public PopupMenuActionProvider(Context context) {
        super(context);
    }

    @Override
    public void onPrepareSubMenu(SubMenu subMenu) {
        subMenu.clear();
        subMenu.add(0, 0, 0, "Sub1");
        subMenu.add(0, 1, 1, "Sub2");
    }

    @Override
    public View onCreateActionView() {
        return null;
    }

    @Override
    public boolean hasSubMenu() {
        return true;
    }
}

而後在activity的menu.xml中item的android:actionProviderClass使用該PopupMenuActionProvider便可。android

 

第二種方式仍然是使用ActionProvider,不過此時是不使用onPrepareSubMenu,而是直接在onCreateActionView中定義。拷貝自別人的blogapp

public class MyActionProvider extends ActionProvider{
    private ContextWrapper mContextWrapper;
    private OnMenuItemClickListener mOnMenuItemClickListener;
    
    public MyActionProvider(Context context) {
        super(context);
        mContextWrapper = (ContextWrapper)context;
    }

    @Override
    public View onCreateActionView() {
        LayoutInflater layoutInflater = LayoutInflater.from(mContextWrapper);
        View view = layoutInflater.inflate(R.layout.my_action_provider, null);
        ImageView popupView = (ImageView)view.findViewById(R.id.popup_view);
        popupView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showPopup(v);
            }
        });
        mOnMenuItemClickListener = new OnMenuItemClickListener() {
            private String TAG = "mOnMenuItemClickListener";

            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                case R.id.Settings1:
                    Log.v(TAG , "Settings1");
                    break;
                case R.id.Settings2:
                    Log.v(TAG , "Settings2");
                    break;

                default:
                    break;
                }
                return false;
            }
        };
        return view;
    }

    private void showPopup(View v) {
        PopupMenu popup = new PopupMenu(mContextWrapper, v);
        MenuInflater inflater = popup.getMenuInflater();
        inflater.inflate(R.menu.popmenu, popup.getMenu());
        popup.setOnMenuItemClickListener(mOnMenuItemClickListener);
        popup.show();
    }

}

這裏是在layout中定義一個imageview,而後在onclick的時候現實一個PopupMenu。ide

 

第三種方式是在activty/fragment的onOptionsItemSelected響應對一個item的點擊,而後建立popupmenu。好處是比第二種方式不用多建立一個類,壞處是代碼偶耦合在activity/fragment中。ui

 

以上兩種方式是子菜單的表現方式,後面的是使用spinner這種相似於子菜單的方式。spa

 

第四種方法是使用ActionBar.SetNavigationMode(NAVIGATION_MODE_LIST)。這實際上是利用了ActionBar自己能夠使用spinner這種drop down list來切換的功能。參考Android actionbar 文檔.net

 

第五種方法是本身指定一個item的類爲spinner,例如定義menu.xml爲code

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" >

    <item
        android:id="@+id/action_spinner"
        android:actionViewClass="android.widget.Spinner"        android:orderInCategory="1"
        android:showAsAction="always"/>
</menu>

而後在代碼中添加spinner的內容。xml

 

第六種方式相似,只是不使用android:actionViewClass而是使用android:actionLayout,在layout.xml中指定使用spinner。htm

總結下,其實這些方式利用了actionbar的幾個功能:

  • 設置NavigationMode爲mode_list來利用actionbar自帶的spinner形式的droplist。
  • 設置actionview爲spinner或其餘view
  • 使用actionprovider來進一步徹底掌控一個menu item的具體行爲。
相關文章
相關標籤/搜索