1

compileSdkVersion を 31 にインクリメントした後 (Android 12)、lint チェックを実行すると、次の問題が発生します。

エラー: 呼び出しには API レベル S が必要です (現在の最小値は 23 です): android.util.SparseArray#set [NewApi]

これをインクリメントした後、誰かが同様の問題を抱えていましたか?なぜそれが発生するのですか?

4

1 に答える 1

10

setAndroid 12 で追加された機能の単なるコピーであり、put代わりに自由に使用できます。

関数を別の名前でコピーした理由は、配列アクセス構文が Kotlin で機能するようにするためです。Kotlin コンパイラは、名前setと 2 つのパラメーターを持つ Java クラスの関数を検出すると、次のような配列構文を使用して呼び出すことができます。

mySparseArray.put(3, someObject)

// is the same as

mySparseArray[3] = someObject

ただし、Android 12 で追加しただけなので、Android 12 (sdk バージョン 31) 未満を対象としている場合、新しい機能を使用することは現実的ではなく、実用化されるまでに数年かかります。

私の意見では、この関数を基本クラスに追加したのは間違いでした。SDK 31 をminSdkVersion. 彼らがそれを追加する前は、拡張関数を使用してこの機能を実現することができましたが、拡張関数の名前が基本クラスの名前に影を落とすため、拡張関数を使用できなくなりました。また、lint は配列アクセス構文のエラーを表示しないため、使用すると実行時にクラッシュします。彼らはこれを の拡張関数として入れるべきでしたandroidx-core-ktx

編集: 「バックポート」を正しく理解している場合、これは次のバージョンで修正される可能性があります。

于 2021-09-10T12:36:36.843 に答える