Разница между ActionBarSherlock и NineOldAndroids для ObjectAnimator на Android <11
У меня есть тестовое задание, которое должно выполнить очень простую задачу: надуть представление и переместить его на экран с помощью ObjectAnimator.
Это прекрасно работает со всеми устройствами (OS 2.2+ - OS4.2), если я использую библиотеку NineOldAndroids.
Однако, если я изменю библиотеку на ActionBarSherlock (предполагается, что внутри будет та же библиотека NineOldAndroid), она будет работать для OS 3.x и выше, но не для устройств 2.2 и 2.3. В этом случае он не может найти свойство и выдает исключение Null Pointer (указано ниже).
У кого-нибудь есть такая же проблема? Есть ли обходной путь, или я фактически использовал обе библиотеки (NineOldAndroids и ActionBarSherlock) для решения проблемы?
Здесь TestsActivity
:
public class TestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
RelativeLayout mainLayout = (RelativeLayout) findViewById(R.id.main_layout);
View testView = getLayoutInflater().inflate(R.layout.object_holder, null);
mainLayout.addView(testView);
AnimatorSet set = new AnimatorSet();
set.playTogether(
ObjectAnimator.ofFloat(testView, "translationX", 100),
ObjectAnimator.ofFloat(testView, "translationY", 100)
);
set.setDuration(0).start();
}
}
(То же самое происходит, если я заменю "translationX" на "x" .)
Вот исключение (это происходит только в том случае, если я использую библиотеку ActionBarSherlock на устройствах 2.2 и 2.3):
05-16 13:24:53.662: E/PropertyValuesHolder(2007): Couldn't find setter property translationX for RelativeLayout with value type float
05-16 13:24:53.662: E/PropertyValuesHolder(2007): RelativeLayout - Couldn't find no-arg method for property translationX: java.lang.NoSuchMethodException: getTranslationX
05-16 13:24:53.662: D/AndroidRuntime(2007): Shutting down VM
05-16 13:24:53.662: W/dalvikvm(2007): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0)
05-16 13:24:53.672: E/AndroidRuntime(2007): FATAL EXCEPTION: main
05-16 13:24:53.672: E/AndroidRuntime(2007): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testanimator/com.example.testanimator.TestActivity}: java.lang.NullPointerException
05-16 13:24:53.672: E/AndroidRuntime(2007): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1821)
05-16 13:24:53.672: E/AndroidRuntime(2007): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1842)
05-16 13:24:53.672: E/AndroidRuntime(2007): at android.app.ActivityThread.access$1500(ActivityThread.java:132)
05-16 13:24:53.672: E/AndroidRuntime(2007): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1038)
05-16 13:24:53.672: E/AndroidRuntime(2007): at android.os.Handler.dispatchMessage(Handler.java:99)
05-16 13:24:53.672: E/AndroidRuntime(2007): at android.os.Looper.loop(Looper.java:150)
05-16 13:24:53.672: E/AndroidRuntime(2007): at android.app.ActivityThread.main(ActivityThread.java:4263)
05-16 13:24:53.672: E/AndroidRuntime(2007): at java.lang.reflect.Method.invokeNative(Native Method)
05-16 13:24:53.672: E/AndroidRuntime(2007): at java.lang.reflect.Method.invoke(Method.java:507)
05-16 13:24:53.672: E/AndroidRuntime(2007): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-16 13:24:53.672: E/AndroidRuntime(2007): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-16 13:24:53.672: E/AndroidRuntime(2007): at dalvik.system.NativeStart.main(Native Method)
05-16 13:24:53.672: E/AndroidRuntime(2007): Caused by: java.lang.NullPointerException
05-16 13:24:53.672: E/AndroidRuntime(2007): at com.actionbarsherlock.internal.nineoldandroids.animation.PropertyValuesHolder.setupSetterAndGetter(PropertyValuesHolder.java:515)
05-16 13:24:53.672: E/AndroidRuntime(2007): at com.actionbarsherlock.internal.nineoldandroids.animation.ObjectAnimator.initAnimation(ObjectAnimator.java:386)
05-16 13:24:53.672: E/AndroidRuntime(2007): at com.actionbarsherlock.internal.nineoldandroids.animation.ValueAnimator.setCurrentPlayTime(ValueAnimator.java:539)
05-16 13:24:53.672: E/AndroidRuntime(2007): at com.actionbarsherlock.internal.nineoldandroids.animation.ValueAnimator.start(ValueAnimator.java:929)
05-16 13:24:53.672: E/AndroidRuntime(2007): at com.actionbarsherlock.internal.nineoldandroids.animation.ValueAnimator.start(ValueAnimator.java:952)
05-16 13:24:53.672: E/AndroidRuntime(2007): at com.actionbarsherlock.internal.nineoldandroids.animation.ObjectAnimator.start(ObjectAnimator.java:364)
05-16 13:24:53.672: E/AndroidRuntime(2007): at com.actionbarsherlock.internal.nineoldandroids.animation.AnimatorSet.start(AnimatorSet.java:501)
05-16 13:24:53.672: E/AndroidRuntime(2007): at com.example.testanimator.TestActivity.onCreate(TestActivity.java:30)
05-16 13:24:53.672: E/AndroidRuntime(2007): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072)
05-16 13:24:53.672: E/AndroidRuntime(2007): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1785)
05-16 13:24:53.672: E/AndroidRuntime(2007): ... 11 more
1 ответ
Вам нужно будет добавить девять старых андроидов в качестве библиотеки проекта или в виде jar-файла, а также actionbarherlock.
На данный момент в вашем коде используется внутренняя версия девять-андроидов android, которая на самом деле не предназначена для использования клиентскими разработчиками. Вы можете использовать и девять старых андроидов, и actionbarsherlock в одном проекте.
Я бы порекомендовал использовать методы ViewHelper.setTranslationX() и ViewHelper.setTranslationY() для того, что вы хотите сделать.