Android, как вы ссылаетесь на новый класс из Lollipop RippleDrawable

У меня есть метод создания 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-интерфейсах без его сбоя на старых устройствах.

То, что я сделал, это создать еще один класс под названием StateApplierLollipop и переместить весь код, связанный с RippleDrawable , и код в StateApplier будет вызывать этот код только в StateApplierLollipop для устройств Lollipop +. Это остановило аварии на 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(.... 

}

Intereting Posts
Анимация ListView элементов в notifyDataSetChanged () Genymotion. Как вытащить базу данных с устройства. Папка my / data / data / кажется пустой Как установить рингтон в Android из моей активности? Как отключить системную панель в Android 3.0 (Honeycomb)? Поверхность была выпущена, когда я пытаюсь установить Disisplay на MediaPlayer Android получает прикрепленное имя файла из приложения gmail Почему Retrofit не может правильно закодировать строку запроса с квадратными скобками? Пользовательское уведомление с Google Cast SDK v3 Высота Android View в CardView не отображается Создайте проект Android в командной строке OSX: Task 'assembleDebug' не найден в корневом проекте Создание приложений с несколькими SDK-приложениями в Eclipse без потери времени компиляции Какой подходящий заменитель устаревших «managedQuery»? Как начать сервис при загрузке устройства в Android? Дим-экран и взаимодействие блоков с нижними строками Google Cloud Messaging – сообщения, полученные мгновенно или с большой задержкой