2

だから私は自分のアプリでいくつかのアニメーションをやろうとしていて、 を使わずにそれを行う方法がありObjectAnimatorましAnimatorListenerAPI 11。ただし、これらのクラスを使用してアニメーションを行うほどスムーズでも堅牢でもありません。

そこで、API レベルをチェックして、オブジェクトのクラスのコードを変更し、API レベルが 11 以上でない限り呼び出されないようにしましたObjectAnimatorAnimatorListener

AnimatorListener問題は、オブジェクトの機能がすべてのバージョンのコードで使用されていないにもかかわらず、オブジェクトが実装されていることです。VerifyErrorAPI レベル 10 以下のデバイスでアプリがクラッシュするようになったため、これがアプリの起動につながっていると思います。

APIレベルに基づいてインターフェースを条件付きで実装する方法、または同じことを達成する別の方法はありますか?

ありがとう!

4

4 に答える 4

3

アニメーション UI を 11 より前にバックポートするhttps://github.com/JakeWharton/NineOldAndroids/を試すことができます。

于 2013-05-09T20:11:35.303 に答える
3

実際には、より高い SDK ターゲットに対して、またはより高い SDK ターゲットを使用してビルドする場合は問題ありません。問題は、より高い SDK からのクラスが欠落しているデバイスでコードが実際に実行される場合のみです。他の人が示唆したように、工場に行くことができます

public class Factory {
  public static <T> T getImplementation(){
    if(<SDK_LEVEL_INCOMPATIBLE>){
      return (T)new <package>.OldSchoolAnimator();
    }else{
      return (T)new <package>.SuperAnimator();
    }
  }
}


...
SomeImplementation impl = new Factory().getImplementation();
...

注意、「SomeImplementation」は、OldSchoolAnimator および SuperAnimator クラスの共通のスーパータイプまたはインターフェースでなければなりません! ファクトリの実装クラスに「インポート」を使用しないでください。完全修飾クラス名を使用してください。

于 2013-05-09T20:39:36.697 に答える
0

リスナーに匿名の内部クラスを使用することになり、他のアニメーション オブジェクトをインポートする代わりに完全修飾クラス名を使用しました。

于 2013-05-09T21:10:15.937 に答える