在Android文档中,对于popup menu的讲解非常的简单,只是说了怎么创建。popup menu有个特点就是必须提供一个anchor view来让popup menu依附于它。sdk文档中有创建popup menu 的函数:
- public void showPopup(View v) {
- PopupMenu popup = new PopupMenu(this, v);
- MenuInflater inflater = popup.getMenuInflater();
- inflater.inflate(R.menu.actions, popup.getMenu());
- popup.show();
- }
这样的话对于在普通的view上面创建popup menu就非常容易了,只需要将该view作为参数调用这个函数就可以了。
但是在action bar上怎么能得到这个anchor view呢?我尝试了n种方法都无法将popup menu顺利得添加到 action bar 上百思不得其解。后来一想,既然这条路走不通了,那能不能从action bar 这着手呢?果然在action bar的sdk中有Add an Action Provider,通过这个可以添加如分享功能的popup menu,当然这个是由系统定义的。而且我们可以定义自己的 action provider。创建MyActionProvider,使其继承ActionProvider类:
- public class MyActionProvider extends ActionProvider {
- /** Context wrapper. */
- private ContextWrapper mContextWrapper;
- PopupMenu mPopupMenu;
- public DtcpActionProvider(Context context) {
- super(context);
- mContextWrapper = (ContextWrapper)context;
- }
- @Override
- public View onCreateActionView() {
- // Inflate the action view to be shown on the action bar.
- 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);
- }
- });
- return view;
- }
- /**
- * show the popup menu.
- *
- * @param v
- */
- private void showPopup(View v) {
- mPopupMenu = new PopupMenu(mContextWrapper, v);
- mPopupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- // do someting
- return false;
- }
- });
- MenuInflater inflater = mPopupMenu.getMenuInflater();
- inflater.inflate(R.menu.popup_up_menu, mPopupMenu.getMenu());
- mPopupMenu.show();
- }
- }
这里面最关键的是实现onCreateActionView()方法,该方法返回的view即为显示在action bar上可以点击的图标。点击后会调用showPopup方法将popup menu创建并显示出来。
my_action_provider.xml即为在action bar上显示的图标:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android=""
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <ImageView
- android:id="@+id/popup_view"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginRight="20dip"
- android:src="@drawable/ownload_icon" />
- </LinearLayout>
popup_menu.xml则为popup menu中的选项:
- <?xml version="1.0" encoding="utf-8"?>
- <menu xmlns:android="" >
- <item
- android:id="@+id/popup_menu_option_download"
- android:title="@string/ics_downloader_strings"/>
- <item
- android:id="@+id/popup_menu_option_share"
- android:title="@string/ics_sharer_strings"/>
- </menu>
最后在menu.xml里面将这个item给添加上,让其在action bar 上显示出来:
- <item
- android:id="@+id/menu_popup_view"
- android:actionProviderClass="my.test.MyActionProvider"
- android:showAsAction="ifRoom"/>
这样的话就可以顺利在action bar 上添加上自定义的popup menu了。
阅读(15801) | 评论(0) | 转发(0) |