Стандартный переход фрагмента не оживляющий

Я использую библиотеку совместимости v4 android для разработки пользовательского интерфейса планшета с использованием фрагментов специально для устройств Android 2.2 и выше.

Все работает так, как должно, за исключением того, что я не могу заставить анимацию работать, даже стандартные анимации.

код:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    ABCFragment abcFragment = new ABCFragment();
    ft.replace(R.id.main_frame_layout_fragment_holder,abcFragment);     
    ft.addToBackStack(null);
    ft.commit();

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

Использование:

ft.setCustomAnimations(android.R.anim.slide_in_left,android.R.anim.slide_out_right);

тоже не работает.

XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.synergygb.mycustomapp"
android:id="@+id/LinearLayout01" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical"
android:gravity="bottom">
<FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/main_frame_layout_fragment_holder">
</FrameLayout>
<!-- OTHER FIXED UI ELEMENTS-->
</RelativeLayout>

Я читал, что пользовательская анимация была повреждена в библиотеке совместимости, но никто, кажется, не имеет проблем со стандартными переходами. Я тестировал это на 3.2.1 Motorola Xoom, 2.3 Galaxy Tab 7 ", 2.2 эмулятор и даже на HTC G2 с 2.3.4.

Что здесь может быть неправильным?

Ответ 1

Я наконец заставил это работать после большого количества проб и ошибок.

Прежде всего, получите самый последний ACL, он исправил пользовательские анимации, и хотя это не было моей конкретной проблемой, как только они сработали, я в итоге использовал их вместо стандартных переходов.

Прямо сейчас я использую:

ft.setCustomAnimations(android.R.anim.fade_in,android.R.anim.fade_out,android.R.anim.fade_in,android.R.anim.fade_out);

Ключом к тому, чтобы заставить его работать на Android 2.1, 2.2 и 2.3, а также на Android 3. 0+ было следующее:

  • Убедитесь, что вы используете ТОЛЬКО API, доступный для самого низкого уровня API, который вы хотите поддерживать (в моем случае 2.1).
  • Компиляция с использованием Android 3.0.
  • В файле манифеста установите android:hardwareAccelerated="true" внутри тега вашего приложения.

Фрагмент анимации теперь работает на всех устройствах. Если вы не установите дополнительную информацию в теге приложения, анимация будет происходить, но очень прерывистым образом, создавая впечатление, что это вообще не произошло.

Надеюсь, это поможет кому-то в будущем!

Как примечание, есть некоторые инструменты проверки API, поэтому вы уверены, что не используете какие-либо API, которые вам недоступны. Я предпочитаю работать на 2.1, поэтому IDE не показывает ничего, что я не могу использовать, когда у меня есть стабильный код, я возвращаюсь к компиляции на 3.0

Ответ 2

Попробуйте снова получить последний ACL, они исправили его: http://code.google.com/p/android/issues/detail?id=15623#c19

Также я заметил, что для setCustomAnimations он должен быть установлен перед транзакционными вызовами как замена, чтобы вступить в силу.

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.in_from_left, R.anim.out_to_right, R.anim.in_from_right, R.anim.out_to_left);
ft.replace(android.R.id.content, newFrag);
ft.addToBackStack(null);
ft.commit();

Ответ 3

выполнить анимацию top_to_bottom для фрагмента,

следовать за тем же, чтобы делать сверху вниз

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.top_to_bottom_fragment,
android.R.animator.fade_out); ft.replace(R.id.simple_fragment,
fragment); 
ft.commit();

top_to_bottom_fragment.xml

<objectAnimator android:duration="400" android:valueFrom="-800"
    android:valueTo="0" android:propertyName="y"
    android:valueType="floatType"
    xmlns:android="http://schemas.android.com/apk/res/android" />

где valueFrom="-800" указывает нижнюю часть макета фрагмента.

Ответ 4

Вы должны позвонить setCustomAnimations, прежде чем добавлять фрагмент. Это позволяет добавлять несколько фрагментов с различными анимациями.

Ответ 5

Я добавил поддержку NineOldAndroids в библиотеку поддержки Google. Подробнее см. http://www.github.com/kedzie/Support_v4_NineOldAndroids. Это позволяет использовать анимации свойств для переходов фрагментов, PageTransformers и некоторых других вещей.

Ответ 6

Надеюсь, это поможет кому-то. API-документы API используют использование objectAnimator для анимации фрагментов, но даже с последним пакетом совместимости objectAnimator в xml не был принят компилятором.

Это работает для меня:

Для Android 3.0 или более поздней версии: объявите xml objectAnimator в папке res/animator.

В пакете Compatibility для менее 3.0: объявить анимацию xml в папке res/anim.