4

コードで RippleDrawables を作成する方法があります

    public class StateApplier {    

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
        private static void add_Ripple(Resources res, StateListDrawable states
                , int color, int pressedColor){
            Drawable rd = new android.graphics.drawable.RippleDrawable(get_Ripple_ColorSelector(pressedColor)
                    , new ColorDrawable(color), null);
            states.addState(new int[] {}, rd);

        }

Lollipop で実行すると問題なく動作しますが、KitKat デバイスで実行するとクラッシュします。ここにエラーログがあります。

03-12 21:36:47.734: E/dalvikvm(26295): Could not find class 'android.graphics.drawable.RippleDrawable', referenced from method com.acme.applib.Render.StateApplier.add_Ripple
03-12 21:36:47.734: W/dalvikvm(26295): VFY: unable to resolve new-instance 149 (Landroid/graphics/drawable/RippleDrawable;) in Lcom/acme/applib/Render/StateApplier;
03-12 21:36:47.734: D/dalvikvm(26295): VFY: replacing opcode 0x22 at 0x0000
03-12 21:36:47.738: W/dalvikvm(26295): VFY: unable to find class referenced in signature (Landroid/graphics/drawable/RippleDrawable;)
03-12 21:36:47.738: W/dalvikvm(26295): VFY: returning Ljava/lang/Object; (cl=0x0), declared Landroid/graphics/drawable/Drawable; (cl=0x0)
03-12 21:36:47.738: W/dalvikvm(26295): VFY:  rejecting opcode 0x11 at 0x0004
03-12 21:36:47.738: W/dalvikvm(26295): VFY:  rejected Lcom/acme/applib/Render/StateApplier;.create_Ripple (Landroid/content/res/Resources;II)Landroid/graphics/drawable/Drawable;
03-12 21:36:47.738: W/dalvikvm(26295): Verifier rejected class Lcom/acme/applib/Render/StateApplier;

@TargetApi(Build.VERSION_CODES.LOLLIPOP)を使用 すると、ロリポップよりも低いデバイスでコードが強制的にスキップされると思いました。メソッド add_Ripple() を呼び出すのではなく、StateApplier クラスの別のメソッドを呼び出すアクティビティでクラッシュするのは奇妙なことです。

メソッドを呼び出す前にAPIチェックも使用していることに注意してください

if( Build.VERSION.SDK_INT >=  Build.VERSION_CODES.LOLLIPOP){
add_Ripple(res, states, color, pressedColor);

古いデバイスでクラッシュすることなく、新しい API でクラスを参照する適切な方法は何でしょうか。

4

1 に答える 1

3

私がしたことは、StateApplierLollipop という別のクラスを作成し、そこにRippleDrawableを扱うすべてのコードを移動することでした。StateApplier のコードは、Lollipop+ デバイスの StateApplierLollipop でのみそのコードを呼び出します。これにより、KitKat でのクラッシュが停止しました。

public class StateApplierLollipop {  
public static void add_Ripple(Resources res, StateListDrawable states
                , int color, int pressedColor){
    ...........
   }
}

public class StateApplier{
public static void add_Ripple(Resources res, StateListDrawable states
                    , int color, int pressedColor){
if( Build.VERSION.SDK_INT >=  Build.VERSION_CODES.LOLLIPOP){
   StateApplierLollipop.add_Ripple(....

}

于 2015-07-18T03:56:38.263 に答える