标签: 如何 分类: Android

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


  1. publicvoidshowPopup(Viewv){
  2. PopupMenupopup=newPopupMenu(this,v);
  3. MenuInflaterinflater=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. publicclassMyActionProviderextendsActionProvider{
  2. /** Context wrapper. */
  3. privateContextWrapper mContextWrapper;

  4. PopupMenumPopupMenu;

  5. publicDtcpActionProvider(Contextcontext){
  6. super(context);
  7. mContextWrapper=(ContextWrapper)context;
  8. }

  9. @Override
  10. publicViewonCreateActionView(){
  11. // Inflate the action view to be shown on the action bar.
  12. LayoutInflater layoutInflater=LayoutInflater.from(mContextWrapper);
  13. Viewview=layoutInflater.inflate(R.layout.my_action_provider,null);
  14. ImageViewpopupView=(ImageView)view.findViewById(R.id.popup_view);
  15. popupView.setOnClickListener(newView.OnClickListener(){
  16. @Override
  17. publicvoidonClick(Viewv){
  18. showPopup(v);
  19. }
  20. });
  21. returnview;
  22. }

  23. /**
  24. * show the popup menu.
  25. *
  26. * @param v
  27. */
  28. privatevoidshowPopup(Viewv){
  29. mPopupMenu=newPopupMenu(mContextWrapper,v);
  30. mPopupMenu.setOnMenuItemClickListener(newOnMenuItemClickListener(){

  31. @Override
  32. publicbooleanonMenuItemClick(MenuItemitem){
  33. // do someting
  34. returnfalse;
  35. }

  36. });
  37. MenuInflaterinflater=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. <?xmlversion="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. <?xmlversion="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了。

更多相关文章

  1. Android sdk配置 常见问题及处理方法
  2. Android之自定义Dialog屏幕旋转时自动关闭解决方法
  3. react native修改APP的名称和图标
  4. Android客户端和服务器端数据交互的第一种方法
  5. Android Google Map实例 - 不同的图标标注在同一图层(Android ma
  6. Android Zxing 转换竖屏扫描且提高识别率的方法
  7. 关于Android的模拟器不能正常启动的解决方法

随机推荐

  1. Android 剪切板ClipboardManager过时问题
  2. Android PageAdapter翻译
  3. Android 手机震动功能实现
  4. Android 学习记录-ScrollView
  5. android 按钮按下效果2
  6. Android bitmap位图旋转
  7. android 使用意图(Intent)实现一键拨号实例
  8. 判断android设备是否支持多点触控
  9. Android O 物理键盘和虚拟键盘同时支持
  10. android layer-list