4

我想在我的应用程序中使用一个弹出菜单,它应该与 Android 1.6+ 兼容。因此,我使用此代码(取自Supporting Different Platform Versions)来区分 pre-Honeycomb (没有PopupMenu)和 Honeycomb+ 以显示 PopupMenu 或 AlertDialog:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    PopupMenu popup = new PopupMenu(this, v);
    ...
} else {
    showDialog(DIALOG_ID);
}

这适用于模拟的 Android 2.1(显示 AlertDialog)、2.3.3(显示 AlertDialog)和 4.2.2(显示 PopupMenu)。但是它不适用于模拟的 Android 1.6。我收到这些错误消息:

E/dalvikvm(211): Could not find class 'android.widget.PopupMenu', referenced from method ...
W/dalvikvm(211): VFY: unable to resolve new-instance 50 (Landroid/widget/PopupMenu;) in L...;
W/dalvikvm(211): VFY:  rejecting opcode 0x22 at 0x0006
W/dalvikvm(211): VFY:  rejected L...;.... (Landroid/view/View;)V
W/dalvikvm(211): Verifier rejected class L...;
W/dalvikvm(211): Class init failed in newInstance call (L...;)

为什么 Android 2.x 的行为符合预期,而 Android 1.6 却没有?

4

1 回答 1

4

查看此类的文档:http: //developer.android.com/reference/android/widget/PopupMenu.html 它已在 API 级别 11 中添加。1.6
是您的应用程序的真正要求吗?它现在几乎不存在。

您有两种解决方案:
- 改用 DialogFragment
- 基于 PopupWindow 创建您自己的实现(如文档http://developer.android.com/training/backward-compatible-ui/older-implementation.html中所建议的那样)

如果您没有真正的理由,我建议您重新考虑将 1.6 作为最低目标,因为对于 0.1% 的安装基数而言,这将带来比实际价值更多的麻烦。无论如何,DialogFragment 是此类 UI 元素的最佳选择,它是兼容性库的一部分(因此它与旧版本的 Android 兼容)。

于 2013-05-11T11:25:50.313 回答