2013-09-27 3 views
3

Я реализовал анимацию окон с помощью ActivityOptionsCompat и ActivityCompat, которая недавно поддерживается в android support-v4 library.ActivityOptionsCompat не работает в android 2.3

Я использовал ниже код для реализации анимации:

Intent subActivity = new Intent(WindowAnimations.this, 
        AnimatedSubActivity.class); 
      // The enter/exit animations for the two activities are 
      // specified by xml resources 
      Bundle translateBundle = ActivityOptionsCompat 
        .makeCustomAnimation(WindowAnimations.this, 
          R.anim.slide_in_left, R.anim.slide_out_left) 
        .toBundle(); 
      ActivityCompat.startActivity(WindowAnimations.this, 
         subActivity, translateBundle); 

Приведенный выше код работает отлично в Android 4.3 и 4.0.

Любой, кто может заставить его работать в 2.X? Любая помощь приветствуется.

+0

Из документов в 'startActivity()' метод:. * При запуске на версии платформы, где эта функция не существует активности будет запущена нормально * , – Luksprog

+0

Спасибо за ваш быстрый комментарий. Но, как я могу видеть в документах ActivityCompat http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html, я не могу найти что-либо описанное таким описанием там. Также я думаю как это дается в поддержке v-4 lib для поддержки этой анимации в старой версии от уровня API 4. Можете ли вы рассказать о ней? –

+0

Документация, которую я цитировал, относится к методу 'startActivity()', который принимает 3 параметра (Activity, Intent, Bundle). Я не работал с этим классом совместимости, но было бы разумно предположить, что анимация может быть невозможна в более низких версиях (из-за ограничений самой системы). Этот класс также может быть введен в пакет совместимости, поэтому вы можете использовать анимацию, когда это возможно (возврат к умолчанию по умолчанию в более низких версиях), поэтому разработчику не нужно реализовывать логику на основе API. – Luksprog

ответ

10

@Luksprog в основном уже ответил на это в первом вопросе, но вот еще несколько документов для дальнейшей поддержки этой претензии.

Прежде всего, прочитайте javadoc для ActivityCompat#startActivity(Activity activity, Intent intent, Bundle options)тщательно. Я выделил некоторые важные ключевые слова:

Начать деятельность с дополнительной информацией, запуска, если умелым.

В Android 4.1+ были введены дополнительные опции, позволяющие контролировать более анимацию запуска активности. Приложения могут использовать этот метод вместе с ActivityOptionsCompat для использования этих анимаций при наличии . При запуске на версиях платформы, где эта функция не существует, активность будет запущена нормально.

Так что, в основном, мы говорим, что функция (необязательная) анимации будет работать только на версиях Android, которые ее поддерживают. На всех других версиях платформы Activity будет запущен «нормально», то есть без дополнительной анимации.

Фактическое доказательство можно легко найти в source code of ActivityCompat:

public static void startActivity(Activity activity, Intent intent, Bundle options) { 
    if (Build.VERSION.SDK_INT >= 16) { 
     ActivityCompatJB.startActivity(activity, intent, options); 
    } else { 
     activity.startActivity(intent); 
    } 
} 

Другими словами: если этот код выполняется на устройстве предварительного JB, обычный старый startActivity() вызов будет злиться, где options параметр игнорируется. Только использование JB-устройств закончится этим.

Возможно, излишне упомянуть, но, очевидно, то же самое относится к модели startActivityForResult().

Подведение итогов: В настоящее время библиотека поддержки просто предлагает статический вспомогательный класс для выполнения определенных функций в «обратная совместимость моды» - на самом деле он не поддерживает эту функциональность (пока). Все, что он делает на этом этапе, - это сохранить, что вам нужно написать условие if/else в своем приложении.

Это говорит о том, что текущая реализация позволяет обеспечить будущий задний ход фактической функциональности. Возможно, поэтому и существует класс ActivityOptionsCompat. Сейчас класс предоставляет «пустую» реализацию для до-JB-устройств, которые теоретически могут быть «заполнены» на более позднем этапе. Любой код, вызывающий эти помощники совместимости, автоматически начнет работать.

Example of an ActivityOptionsCompat call возвращая пустую реализацию:

public static ActivityOptionsCompat makeCustomAnimation(Context context, 
     int enterResId, int exitResId) { 
    if (Build.VERSION.SDK_INT >= 16) { 
     return new ActivityOptionsImplJB(
      ActivityOptionsCompatJB.makeCustomAnimation(context, enterResId, exitResId)); 
    } 
    return new ActivityOptionsCompat(); 
} 
Смежные вопросы