如何在ActionBar上面添加popup menu

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


  1. 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类:

  1. 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上显示的图标:

  1. <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/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中的选项:

  1. <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/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 上显示出来:

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

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


你可能感兴趣的:(如何在ActionBar上面添加popup menu)