2017-02-11 149 views
0

在我的Android应用程序中,我有一个菜单选项,当设备具有专用硬件菜单选项时工作。对于另一个设备,我没有专用的菜单按钮,所以我尝试添加一个按钮,然后点击该按钮,弹出窗口将显示菜单,弹出窗口正在工作,但不显示选项,并进一步说明如何处理所选弹出选项。Android弹出菜单不加载菜单

我的按键布局如下:

<ImageButton 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:src="@drawable/ic_overflow_holo_dark" 
    android:contentDescription="@string/descr_overflow_button" 
    android:onClick="showPopup" /> 

这是我的代码,以显示弹出:

public boolean showPopup(View v) { 
    PopupMenu popup = new PopupMenu(this, v); 
    MenuInflater inflater = popup.getMenuInflater(); 
    inflater.inflate(R.menu.emailmenu, popup.getMenu()); 
    popup.show(); 
    return true; 
} 

这我option代码:

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/bluebutton" android:icon="@drawable/icon_blue_btn" 
     android:title="" /> 
    <item android:id="@+id/zephyr" android:icon="@drawable/icon_zephyrme" 
     android:title="" /> 
    <item android:id="@+id/skype" android:icon="@drawable/icon_skype" 
     android:title="" /> 
</menu> 

我都准备好了有这onCreateOptionsMenu()从专用菜单键触发选项。如何让它从弹出式工作。

+0

标题是菜单重要 – Jayanth

+0

确定以及如何启动相关的弹出菜单 –

+0

使用的活动'popup.setOnMenuItemClickListener()' – Jayanth

回答

1

如果你想显示的图标,而不是标题,然后创建您的PopupMenu像下面

方法setForceShowIcon(menu);将迫使PopMenu显示的图标。 你也可以带有图标的文字。

private void showPopupMenu(){ 
    PopupMenu menu=new PopupMenu(this,anchorView); 
    menu.getMenuInflater().inflate(R.menu.popup_menu,menu.getMenu()); 
    setForceShowIcon(menu); 
    menu.setOnMenuItemClickListener(menuClickListner); 
    menu.show(); 
} 

public static void setForceShowIcon(PopupMenu popupMenu) { 
    try { 
     Field[] fields = popupMenu.getClass().getDeclaredFields(); 
     for (Field field : fields) { 
      if ("mPopup".equals(field.getName())) { 
       field.setAccessible(true); 
       Object menuPopupHelper = field.get(popupMenu); 
       Class<?> classPopupHelper = Class.forName(menuPopupHelper 
         .getClass().getName()); 
       Method setForceIcons = classPopupHelper.getMethod(
         "setForceShowIcon", boolean.class); 
       setForceIcons.invoke(menuPopupHelper, true); 
       break; 
      } 
     } 
    } catch (Throwable e) { 
     e.printStackTrace(); 
    } 
} 
//This is Menu click listner 
PopupMenu.OnMenuItemClickListener menuClickListner = new PopupMenu.OnMenuItemClickListener() { 
    @Override 
    public boolean onMenuItemClick(MenuItem item) { 
     switch (item.getItemId()){ 
      case R.id.some_id1: 
       //actions here 
       break; 
      case R.id.some_id2: 
       //actions here.. 
       break; 
      case R.id.some_id3: 
       break; 
      } 
     return false; 
    } 
}; 

希望这有助于!

+0

为什么返回设置为false –

+0

好吧,这是一个很长的答案,你可以在这里看到答案http://stackoverflow.com/a/23176258/5235032 – Jayanth

0

尝试这样

PopupMenu popup = new PopupMenu(MainActivity.this, button1); 
popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu()); 
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem item) { 
       startActivity(new Intent(MainActivity.this, SecounActivity.class)); 
       return true; 
      } 
     }); 
popup.show(); 
+0

你能解释为什么,如果我想的图标,而不是标题 –

+0

它工作与否,'MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.emailmenu,popup.getMenu());'它喜欢你为它创建新的对象。即时通讯不知道100%,但这可能是问题 –

+0

没有我的代码工作,但由于我没有添加标题,所以名称不来。所以这是我首先关心的问题,其次我想根据选择的弹出选项开始一项活动。我已标记答案正确,因为它解决了我的问题。 –