第一種方式是使用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中定義。拷貝自別人的blog:app
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的幾個功能: