5

API レベル 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のドキュメントisItemCheckedは、API レベル 1 の互換性があると記載されていますが、なぜエラーが発生するのですか?

4

1 に答える 1

10

どうやらこれは何が起こるかです:

API レベル 1 以降、Android フレームワークにはisItemChecked既にListView.

しかし、API レベル 11 のリリースで、Google は の定義をisItemCheckedAbsListViewスーパークラスである に移動しましたListView。この変更により、既存のコード (API レベル 11 より前のバージョンに対してコンパイルするためのもの) を API レベル 11 に対してコンパイルすることは妨げられませんが、生成された .class ファイルは実際には、API レベル 11 より前のデバイスには存在しないisItemCheckedonを探します。AbsListView

API Differences Reportには、次のように記載されています。

boolean isItemChecked(int) メソッドはローカルで定義されていましたが、現在は から継承されていAbsListViewます。

コンパイル時に互換性をまったくチェックできないため、これは危険な落とし穴です。ListViewasおよび notとしてキャストすることを忘れないでAbsListViewください。たぶん、私たちは完全に避けるべきAbsListViewです。

于 2011-09-05T10:04:03.090 に答える