2

API レベル 16のコードを含む SDK 9+ を必要とするアプリがあります。apksetBackgroundDrawable()のコーディングまたはビルド中にエラーは発生しませんでした。しかし、Google アナリティクスでこのエラーが発生したというレポートが約 50 件あり、開発者コンソールでいくつかのレポートがありました。

糸くずチェッカーを実行しても、警告は表示されません。エクリプスを使用しています。最小限の API でサポートされていないメソッドを追加したときに通常のようにコンパイルに失敗しない理由はありますか、それとも単に Eclipse のバグですか?

4

2 に答える 2

6

おそらくSDK 16+でビルドしていて、メソッドがそこにあるため、ビルド時にエラーは発生しません。ただし、apk を 2.1 Android フォンにインストールすると、MethodNotFound例外がスローされます。したがって、将来的には常に最小ターゲットデバイスにapkをインストールして、何かを忘れていないかどうかを確認してください. Min-Target は基本的に、PLAY ストア (および lint 警告など) のフィルターのみです。

AFAIK からimageView.setBackground(...)への移行imageView.setBackgroundDrawable(...)は、API スタイルの設計上の選択に過ぎませんでした。したがって、Android SDK 18 のソースを見ると、次のように表示されます。

/**
     * Set the background to a given Drawable, or remove the background. If the
     * background has padding, this View's padding is set to the background's
     * padding. However, when a background is removed, this View's padding isn't
     * touched. If setting the padding is desired, please use
     * {@link #setPadding(int, int, int, int)}.
     *
     * @param background The Drawable to use as the background, or null to remove the
     *        background
     */
    public void setBackground(Drawable background) {
        //noinspection deprecation
        setBackgroundDrawable(background);
    }

したがって、今のところ、どちらを使用してもまったく関係ありませんが、もちろんこれは変更される可能性があります (ただし、SDK 16 より前に行われたほぼすべてのアプリが機能しなくなるため、将来変更される可能性は低いです) - 基本的にsetBackground()SDK でも使用できます18歳以上

したがって、将来性はあるが醜い側になりたい場合は、他の回答で示されているバージョンフォークを使用できます

if(Build.VERSION.SDK_INT >= 16) {
//new code
} else {
//deprecated code
}

1 つだけ、これは個人的なスタイルの好みかもしれませんが、次のような注釈で Lint 警告を抑制しません。

@SuppressLint("NewApi")
@SuppressWarnings("deprecation")

後でリファクタリング/より高いSDKに移動したい場合、これらの醜いスイッチを簡単に取り除くことができるので、警告を保持するのが好きです.


更新: Google の v4 サポート ライブラリには、sdk ボイラー プレート コードのヘルパー クラスが含まれています。この場合、次を使用します。

ViewCompat.setBackground(view,drawable);

これにより、SDK チェックが処理されます。

于 2013-10-25T07:38:51.473 に答える