5

我正在针对 API 级别 11 (3.0) 编译一个 Android 项目,并且我有以下代码:

if (parent instanceof AbsListView) {
    checked = ((AbsListView)parent).isItemChecked(position);
}

当我在 pre-3.0(低于 API 级别 11)设备中运行它时,我收到此错误:

java.lang.NoSuchMethodError: android.widget.AbsListView.isItemChecked

AbsListView 文档中,isItemChecked声明为具有 API 级别 1 兼容性,那么为什么会出现错误?

4

1 回答 1

10

显然这就是发生的事情:

从 API Level 1 开始,Android 框架已经isItemCheckedListView.

但是,在 API Level 11 发布时,Google 将 的定义isItemChecked移至AbsListView,它是 的超类ListView。此更改不会阻止现有代码(旨在针对 API 级别 11 进行编译)针对 API 级别 11 进行编译,但生成的 .class 文件实际上会查找isItemCheckedon AbsListView,这在 API 级别 11 之前的设备上不存在。

API 差异报告中,指出:

boolean isItemChecked(int) 方法是本地定义的,但现在继承自AbsListView.

这是一个危险的陷阱,因为根本无法在编译时检查兼容性。您必须记住将其转换为ListView而不是AbsListView。也许我们应该完全避免AbsListView

于 2011-09-05T10:04:03.090 回答