Стандартный переход фрагмента не оживляющий
Я использую библиотеку совместимости 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.