如何在ActionBar上面添加popup menu

http://blog.chinaunix.net/uid-20771867-id-3140408.html

在Android文档中,对于popup menu的讲解非常的简单,只是说了怎么创建。popup menu有个特点就是必须提供一个anchor view来让popup menu依附于它。sdk文档中有创建popup menu 的函数: 


  1. public void showPopup(View v) {
  2.     PopupMenu popup = new PopupMenu(this, v);
  3.     MenuInflater inflater = popup.getMenuInflater();
  4.     inflater.inflate(R.menu.actions, popup.getMenu());
  5.     popup.show();
  6. }
     这样的话对于在普通的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类:

  1. public class MyActionProvider extends ActionProvider {
  2.     /** Context wrapper. */
  3.     private ContextWrapper mContextWrapper;

  4.     PopupMenu mPopupMenu;

  5.     public DtcpActionProvider(Context context) {
  6.         super(context);
  7.         mContextWrapper = (ContextWrapper)context;
  8.     }

  9.     @Override
  10.     public View onCreateActionView() {
  11.         // Inflate the action view to be shown on the action bar.
  12.         LayoutInflater layoutInflater = LayoutInflater.from(mContextWrapper);
  13.         View view = layoutInflater.inflate(R.layout.my_action_provider, null);
  14.         ImageView popupView = (ImageView)view.findViewById(R.id.popup_view);
  15.         popupView.setOnClickListener(new View.OnClickListener() {
  16.             @Override
  17.             public void onClick(View v) {
  18.                 showPopup(v);
  19.             }
  20.         });
  21.         return view;
  22.     }

  23.     /**
  24.      * show the popup menu.
  25.      *
  26.      * @param v
  27.      */
  28.     private void showPopup(View v) {
  29.         mPopupMenu = new PopupMenu(mContextWrapper, v);
  30.         mPopupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {

  31.             @Override
  32.             public boolean onMenuItemClick(MenuItem item) {
  33.                 // do someting
  34.                 return false;
  35.             }

  36.         });
  37.         MenuInflater inflater = mPopupMenu.getMenuInflater();
  38.         inflater.inflate(R.menu.popup_up_menu, mPopupMenu.getMenu());
  39.         mPopupMenu.show();
  40.     }
  41. }
            这里面最关键的是实现 onCreateActionView ( )方法,该方法返回的view即为显示在action bar上可以点击的图标。点击后会调用showPopup方法将popup menu创建并显示出来。

           my_action_provider.xml即为在action bar上显示的图标:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:orientation="vertical" >

  6.     <ImageView
  7.         android:id="@+id/popup_view"
  8.         android:layout_width="wrap_content"
  9.         android:layout_height="wrap_content"
  10.         android:layout_marginRight="20dip"
  11.         android:src="@drawable/ownload_icon" />

  12. </LinearLayout>
         popup_menu.xml则为popup menu中的选项:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android" >
  3.     <item
  4.         android:id="@+id/popup_menu_option_download"
  5.         android:title="@string/ics_downloader_strings"/>

  6.     <item
  7.         android:id="@+id/popup_menu_option_share"
  8.         android:title="@string/ics_sharer_strings"/>

  9. </menu>
    最后在menu.xml里面将这个item给添加上,让其在action bar 上显示出来:

  1. <item
  2.         android:id="@+id/menu_popup_view"
  3.         android:actionProviderClass="my.test.MyActionProvider"
  4.         android:showAsAction="ifRoom"/>

    这样的话就可以顺利在action bar 上添加上自定义的popup menu了。


你可能感兴趣的:(android,layout,文档,action,menu,encoding)