Android V7支持库弹出菜单

13

我正在尝试使用Support V7 Library实现PopupMenu。所有编译都很好,但当我尝试调用以下内容时:

    PopupMenu popup = new PopupMenu(this, v);
    popup.getMenu().add(Menu.NONE,MENU_SHARE_A,1,R.string.A);
    popup.getMenu().add(Menu.NONE,MENU_SHARE_B,2,R.string.B);
    popup.show();

在调用时出现错误:

07-31 17:23:53.365: E/AndroidRuntime(14128): java.lang.RuntimeException: Binary XML file line #17: You must supply a layout_height attribute.

我认为这是指"abc_popup_menu_item_layout.xml"文件中的此元素:

<android.support.v7.internal.view.menu.ListMenuItemView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="?attr/dropdownListPreferredItemHeight"
        android:minWidth="196dip"
        android:paddingRight="16dip">

这是一个 bug,还是我做错了什么?

6个回答

18
PopupMenu popup = new PopupMenu(this, v);

"this"指的是什么?第一个参数必须是像Activity这样的上下文,而不是ApplicationContext!


1
正是我所需要的。关键是上下文必须匹配! - dst
我之前传递的是应用程序上下文而不是活动上下文。这个答案真的救了我一命。我正在从一个适配器中创建 PopupMenu,该适配器填充了一个 FragmentListView 并意外地将应用程序上下文传递给了该适配器,结果也传递给了 PopupMenu 构造函数...记住,孩子们,你的 Context 很重要! - JorgeGRC

14

你可能需要检查一下你的清单文件中是否指定了适当的主题:

<application ... android:theme="@style/Theme.AppCompat">

1
对我来说,问题出在主题上。我在一个单元测试中遇到了问题,试图打开菜单。不知何故,在测试期间主题没有被设置,所以我不得不使用context.setTheme(...)手动设置它。 - Jason Polites

1

将这行代码添加到您的Activity中的manifest.xml文件中。

android:theme="@style/Theme.AppCompat"

0

同时检查一下manifest.xml中每个活动是否应用了其他样式。这将覆盖应用标签中的Theme.AppCompat。


0

@style/Theme.AppCompat.Light 对我解决了问题。@style/Theme.AppCompat 是一个黑色主题,它不适合我的应用程序。


0

您的布局文件 "abc_popup_menu_item_layout.xml" 已经定义了高度。

要么 "?attr/dropdownListPreferredItemHeight" 是来自不同主题或库(例如ActionBarSherlock),要么错误来自不同的布局文件。

此外,如果将 "?attr/dropdownListPreferredItemHeight" 替换为类似于 "60dp" 的内容,错误是否消失?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接