2017-02-28 145 views
1

我试图在点击操作栏图标上显示弹出式菜单。 问题是我得到应用程序的强制关闭,并且弹出菜单不显示。我的代码有什么问题?感谢您的帮助。单击操作栏上的弹出菜单图标

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_action, menu); 

     return true; 
    } 


@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     Toast.makeText(getApplicationContext(), "ItemSelected = " + item, Toast.LENGTH_SHORT).show(); 
      case R.id.action_sort: 
      showPopup(item.getActionView()); 
    } 

    return super.onOptionsItemSelected(item); 
} 


public void showPopup(View v) { 
    PopupMenu popup = new PopupMenu(this, v); 
    Toast.makeText(getApplicationContext(), "showPopup = " + popup, Toast.LENGTH_SHORT).show(); 
    MenuInflater inflater = popup.getMenuInflater(); 
    inflater.inflate(R.menu.popup_menu, popup.getMenu()); 
    popup.show(); 
    } 

menu_action.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" tools:context=".FileManagerActivity"> 

    <item android:id="@+id/action_sort" android:title="@string/action_sort" android:icon="@drawable/ic_sort" 
     android:showAsAction="always" /> 

    <item android:id="@+id/action_settings" android:title="@string/action_settings" 
     app:showAsAction="never" /> 

    <item android:id="@+id/action_help" android:title="@string/action_help" 
     app:showAsAction="never" /> 

</menu> 

popup_menu.xml

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:id="@+id/opt1" 
     android:icon="@drawable/ic_sort" 
     android:title="Change Picture" /> 
    <item 
     android:id="@+id/opt2" 
     android:icon="@drawable/ic_fast_forward" 
     android:title="Change Password" /> 

    <item 
     android:id="@+id/opt3" 
     android:icon="@drawable/ic_fast_rewind" 
     android:title="Sign Out" /> 
</menu> 

的logcat:

02-28 13:04:45.353 18838-18838/com.test.audio E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.test.audio, PID: 18838 
    java.lang.IllegalStateException: MenuPopupHelper cannot be used without an anchor 
      at android.support.v7.internal.view.menu.MenuPopupHelper.show(MenuPopupHelper.java:126) 
      at android.support.v7.widget.PopupMenu.show(PopupMenu.java:193) 
      at com.test.audio.TouchActivity.showPopup(TouchActivity.java:5340) 
      at com.test.audio.TouchActivity.onOptionsItemSelected(TouchActivity.java:5270) 
      at android.app.Activity.onMenuItemSelected(Activity.java:2885) 
      at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1133) 
      at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:761) 
      at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) 
      at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:904) 
      at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:894) 
      at android.widget.ActionMenuView.invokeItem(ActionMenuView.java:587) 
      at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:141) 
      at android.view.View.performClick(View.java:4780) 
      at android.view.View$PerformClick.run(View.java:19866) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5254) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
+0

@Fazel我修改我的代码,每经发布,并添加这样的:公共无效showPopup(视图v){查看menuItemView = findViewById( R.id.action_sort);和这个代码:popupMenu.inflate(R.menu.popup_menu);当我运行该应用程序时,它强制关闭这个错误:java.lang.RuntimeException:无法解析索引6 – user2308699

回答

1

不通过菜单项的查看原因它不是。 所以。最好投它作为视图这样

View menuItemView = findViewById(R.id.menu_overflow); // SAME ID AS MENU ID 
PopupMenu popupMenu = new PopupMenu(this, menuItemView); 
popupMenu.inflate(R.menu.counters_overflow); 
// And define click listener here. 
popupMenu.show(); 

Source

+0

的属性与你现在推荐的代码我得到这个错误:java.lang.RuntimeException:无法解析属性在索引6.关于如何纠正这个错误的任何想法? – user2308699

+0

@ user2308699它与您检查lib或您已经使用的导入代码没有任何关系检查此处同样的问题http://stackoverflow.com/questions/30595187/android-xml-runtimeexception-failed-to-resolve-attribute- at-index-6 –

+0

感谢代码显示PopupMenu。这是解决我遇到的问题的一步。 – user2308699