Показать / скрыть фрагмент в анимации фрагментов [duplicate]

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

Для меня причина в том, что я переименовал файл, и старый файл все еще был открыт.

244
задан Programmer Bruce 29 May 2011 в 07:48
поделиться

5 ответов

Чтобы оживить переход между фрагментами или оживить процесс показа или скрыть фрагмент, вы используете Fragment Manager для создания Fragment Transaction.

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

Следующий код показывает, как вы заменили бы фрагмент, скользя один фрагмент и скользящий другой в своем месте.

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);

DetailsFragment newFragment = DetailsFragment.newInstance();

ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");

// Start the animated transition.
ft.commit();

Чтобы добиться того же самого, скрывая или отображая фрагмент, который вы просто назовете ft.show или ft.hide, передав фрагмент, который вы хотите показать или скрыть соответственно.

Для справки определения XML-анимации будут использовать тег objectAnimator. Пример slide_in_left может выглядеть примерно так:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="x" 
    android:valueType="floatType"
    android:valueFrom="-1280"
    android:valueTo="0" 
    android:duration="500"/>
</set>
358
ответ дан Reto Meier 24 August 2018 в 17:30
поделиться

Если вам не нужно использовать библиотеку поддержки, посмотрите на ответ Roman.

Но если вы хотите использовать библиотеку поддержки, вы должны использовать старой анимационной каркас, как описано ниже.

После консультаций с ответами и blindstuff's я получил следующий код.

фрагменты появляются сползанием справа и сползанием влево при нажатии назад.

FragmentManager fragmentManager = getSupportFragmentManager();

FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);

CustomFragment newCustomFragment = CustomFragment.newInstance();
transaction.replace(R.id.fragment_container, newCustomFragment );
transaction.addToBackStack(null);
transaction.commit();

Порядок важен. Это означает, что вы должны называть setCustomAnimations() до replace() или анимация не вступает в силу!

Затем эти файлы должны быть помещены внутри res / anim .

enter.xml :

<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="100%"
               android:toXDelta="0"
               android:interpolator="@android:anim/decelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

exit.xml :

<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="-100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

pop_enter.xml :

<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="-100%"
               android:toXDelta="0"
               android:interpolator="@android:anim/decelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

pop_exit.xml :

<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

Длительность анимация может быть изменена на любое из значений по умолчанию, таких как @android:integer/config_shortAnimTime или любое другое число.

Обратите внимание, что если между заменами фрагментов происходит изменение конфигурации (например, вращение), заднее действие не анимируется. Это документальная ошибка , которая все еще существует в rev 20 библиотеки поддержки.

219
ответ дан Community 24 August 2018 в 17:30
поделиться

Пожалуйста, используйте это, я думаю, что гораздо лучшие решения. Android Studio предоставляет значение по умолчанию animation.

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

            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
            fragmentManager.addOnBackStackChangedListener(this);
            fragmentTransaction.replace(R.id.frame, firstFragment, "h");
            fragmentTransaction.addToBackStack("h");
            fragmentTransaction.commit();

Выход:

10
ответ дан Gowthaman M 24 August 2018 в 17:30
поделиться

Моя модифицированная библиотека поддержки поддерживает использование анимаций просмотра (например, <translate>, <rotate>) и объектных аниматоров (т. е. <objectAnimator>) для фрагментарных переходов. Он реализован с помощью NineOldAndroids . Подробнее см. В моей документации по github.

5
ответ дан mark.kedzierski 24 August 2018 в 17:30
поделиться

Я решаю этот способ ниже

Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide);
fg.startAnimation(anim);
this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment
1
ответ дан Shakawat Hossain 24 August 2018 в 17:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: