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的具体行为。
相关文章
相关标签/搜索