Как оживить удаление фрагментов
Я хочу анимировать удаление фрагмента.
Я пробовал:
getSupportFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out)
.remove(myFragment)
.commit();
но фрагмент просто исчезает.
Я заметил, что анимация только воспроизводится с помощью "replace", поэтому я попытался заменить фрагмент на пустой фрагмент следующим образом:
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out)
.replace(viewId, new Fragment())
.commit();
Но он все еще просто исчезает, исчезает.
Итак, как я могу анимировать удаление фрагмента?
Ответы
Ответ 1
Я понял это.
Выходное представление анимируется на холсте входного представления, поэтому, если нет входного холста, для анимации нет холста.
Чтобы показать анимацию, мне приходилось всегда использовать замену и использовать входящие фрагменты того же размера, что и те, которые выходят. После завершения анимации я установил, что новые фрагменты исчезли.
Ответ 2
Я видел это, когда у меня были подобные проблемы, и просто подумал, что Id опустил быструю ноту.
Вместо того, чтобы создавать фиктивный фрагмент, чтобы заменить существующий, я думаю, вы должны анимировать текущее представление фрагментов. Когда анимация заканчивается, вы можете просто удалить фрагмент.
Вот как я это сделал:
final FragmentActivity a = getSherlockActivity();
if (a != null) {
//Your animation
Animation animation = AnimationUtils.loadAnimation(a, R.anim.bottom_out);
animation.setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime));
//You can use AnimationListener, MagicAnimationListener is simply a class extending it.
animation.setAnimationListener(new MagicAnimationListener() {
@Override
public void onAnimationEnd(Animation animation) {
//This is the key, when the animation is finished, remove the fragment.
try {
FragmentTransaction ft = a.getSupportFragmentManager().beginTransaction();
ft.remove(RestTimerFragment.this);
ft.commitAllowingStateLoss();
} catch (Exception e) {
e.printStackTrace();
}
}
});
//Start the animation.
getView().startAnimation(animation);
}
Ответ 3
Вы можете анимировать удаление, установив эту пользовательскую анимацию для фрагмента транзакции.
fragmentTransaction.setCustomAnimations(R.anim.right_in, R.anim.defff,R.anim.defff,R.anim.right_out);
Третий и четвертый параметры предназначены для удаления фрагмента.
Ответ 4
Замена пустым фрагментом перед точкой вставки следующего фрагмента, а также задержка вставки следующего фрагмента (на 200 мс), чтобы анимация выхода пустого фрагмента могла играть, решила мою проблему.
Этот код вставляет пустой фрагмент с анимацией выхода.
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(R.anim.exit, R.anim.pop_exit)
.replace(R.id.fragmentLayout, new Fragment())
.commit();
Exit.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="-100%"
android:interpolator="@android:anim/accelerate_interpolator"
android:duration="200"/>
</set>
pop_exit.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="100%"
android:interpolator="@android:anim/accelerate_interpolator"
android:duration="200"/>
</set>
Ответ 5
Я получил вдохновение от ответа Zoltish, это моя реализация:
1.add этот метод внутри фрагмента, он будет анимировать фрагмент из экрана влево:
public void animateOut()
{
TranslateAnimation trans=new TranslateAnimation(0,-300*Utils.getDensity(getActivity()), 0,0);
trans.setDuration(150);
trans.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
((BetsActivty)getActivity()).removeFrontFragmentAndSetControllToBetting();
}
});
getView().startAnimation(trans);
}
Метод, который внутри atAnimationEnd() удаляет фрагмент следующим образом:
getSupportFragmentManager().beginTransaction().
remove(getSupportFragmentManager().findFragmentById(R.id.fragment_container)).commit();
2.Выполните animateOut фрагмента из onBack() активности.
Приветствия
кстати, мой getDensity():
public static int getDensity(Context context)
{
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
return (int)metrics.density;
}
с этим я рассчитываю значение DP для текущего текущего устройства.
Ответ 6
поскольку @hugoc сказал
Выходное представление анимируется на холсте входного представления, поэтому, если нет входного холста, для анимации нет холста.
Чтобы показать анимацию, мне приходилось всегда использовать замену и использовать входящие фрагменты того же размера, что и те, которые выходят. После завершения анимации я установил, что новые фрагменты исчезли.
ниже - действительный код:
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.setCustomAnimations(R.anim.slide_in_bottom, R.anim.slide_out_top);
transaction.hide(removeFragment).add(R.id.fragment_container,addFragment).commit();
transaction = manager.beginTransaction();
transaction.remove(removeFragment).commit();
Ответ 7
Я согласился с hugoc и вот какой код
решить его
public class MyActivity extends Activity {
//Some thing
public void Fragment2BackToFragment1(Fragment fragment1, Fragment fragment2) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
animateExit(fragment2);
ft.replace(R.id.main_content, fragment1, "fragment1");
ft.commit();
}
private void animateExit(Fragment exitFragment) {
if (exitFragment != null) {
final View view = exitFragment.getView();
if (view != null) {
int anim = R.anim.fade_out;
Animation animation =
AnimationUtils.loadAnimation(getActivity(), anim);
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
view.postDelayed(new Runnable() {
@Override
public void run() {
view.setVisibility(View.GONE);
}
}, 300);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
view.startAnimation(animation);
}
}
}
}
Ответ 8
Что введите:
это новый фрагмент, который должен быть показан
Какой выход:
это текущий фрагмент, который должен быть скрыт
Что такое popEnter:
это предыдущий фрагмент, который должен быть показан
Какой popExit:
это текущий фрагмент, который должен быть скрыт
Для использования этих анимаций вам следует настроить таргетинг на команды show или hide transaction. Выйти из анимации не работает с процедурами удаления/замены.
Ответ 9
Легкое исправление ниже:
1-Вызов анимировать для фрагмента. GetView().
2-Удалить фрагмент внутри onAnimationEnd().
final Fragment frag= getSupportFragmentManager().findFragmentById(R.id.fragmentContainer);
frag.getView().animate().alpha(0f).scaleX(0f).scaleY(0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
getSupportFragmentManager()
.beginTransaction()
.remove(frag)
.commit();
}
}).start();
Ответ 10
setCustomAnimations (enter, exit, popEnter, popExit) поддерживают анимацию входа и выхода, поэтому задайте четыре анимации и сохраните их до транзакции.replace()
Котлин:
val manager = supportFragmentManager
val transaction = manager.beginTransaction()
transaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right ,
android.R.anim.slide_in_left, android.R.anim.slide_out_right)
transaction.commit()
Ответ 11
Итак, простой способ:
Когда вы открываете фрагмент (вызывается из родительского Activity):
FragmentA fragment = new FragmentA();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.anim.slide_up, R.anim.slide_down);
transaction.add(android.R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commit();
Укажите транзакции входа и выхода
transaction.setCustomAnimations(R.anim.slide_up, R.anim.slide_down);
При закрытии фрагмента (вызывается изнутри фрагмента)
getActivity().getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_up, R.anim.slide_down).remove(this).commit();
Укажите транзакции входа и выхода
setCustomAnimations (R.anim.slide_up, R.anim.slide_down)