我正在针对API Level 11(3.0)编译一个Android项目,我有这个代码:
if (parent instanceof AbsListView) {
checked = ((AbsListView)parent).isItemChecked(position);
}
当我在3.0之前(低于API级别11)设备运行时,我收到此错误:
java.lang.NoSuchMethodError: android.widget.AbsListView.isItemChecked
在AbsListView documentation中,isItemChecked
被声明为具有API级别1兼容性,那么为什么我会收到错误?
答案 0 :(得分:10)
显然会发生这种情况:
自API级别1以来,Android框架isItemChecked
上已ListView
。
但是,在API Level 11发布时,Google将isItemChecked
的定义移至AbsListView
,这是ListView
的超类。此更改不会阻止现有代码(用于针对API级别11进行编译)针对API级别11进行编译,但生成的.class文件实际上会在isItemChecked
上查找AbsListView
,但不会存在于API级别11之前的设备上。
在API Differences Report上,声明:
boolean isItemChecked(int)
方法是本地定义的,但现在继承自AbsListView
。
这是一个危险的陷阱,因为在编译时根本无法检查兼容性。您必须记住将其转换为ListView
而不是AbsListView
。也许我们应该避免AbsListView
altogther。