片段过渡时屏幕闪烁

Mil*_*ary 7 animation android fragment android-transitions

这是按下后退按钮时录制的链接

当我在片段事务中使用动画时,它工作正常,但下一个屏幕闪烁,这让我很恼火。我一直在寻找它,因为 2 天没有进展。

我正在使用此代码进行转换

public void moveToBaseSelect() {
    FragmentTransaction ft = fragmentManager.beginTransaction();
    ft.setCustomAnimations(R.anim.enter_from_right,R.anim.exit_to_left,R.anim.enter_from_left,R.anim.exit_to_right);
    ft.replace(R.id.home_frame, new BaseSelectFragment(), HomeActivity.BASE_SELECT);
    ft.addToBackStack(HomeActivity.BASE_SELECT);
    ft.commit();

}

public void moveToLogin()
{
    if(fragmentManager.getBackStackEntryCount()>=1 && fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount()-1).getName().equals(HomeActivity.LOGIN))
        return;

    FragmentTransaction ft = fragmentManager.beginTransaction();
    ft.setCustomAnimations(R.anim.enter_from_right,R.anim.exit_to_left,R.anim.enter_from_left,R.anim.exit_to_right);
    ft.replace(R.id.home_frame, new LoginFragment(), HomeActivity.LOGIN);
    ft.addToBackStack(HomeActivity.LOGIN);
    ft.commit();
}
Run Code Online (Sandbox Code Playgroud)

动画文件

从左边进入

<set>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:fillAfter="true"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromXDelta="-100%p"
        android:toXDelta="0%p" />
</set>
</set>
Run Code Online (Sandbox Code Playgroud)

从右边进入

<?xml version="1.0" encoding="utf-8"?>
<set>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:fillAfter="true"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromXDelta="100%p"
        android:toXDelta="0%p" />
</set>
</set>
Run Code Online (Sandbox Code Playgroud)

向左退出

<?xml version="1.0" encoding="utf-8"?>
<set>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:fillAfter="true"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromXDelta="0%p"
        android:toXDelta="-100%p" />
</set>
</set>
Run Code Online (Sandbox Code Playgroud)

向右退出

 <?xml version="1.0" encoding="utf-8"?>
<set>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:fillAfter="true"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromXDelta="0%p"
        android:toXDelta="100%p" />
</set>
</set>
Run Code Online (Sandbox Code Playgroud)

我已经尝试了一种替代方法,它使用 animator 而不是 anim 和 app.fragment 而不是 v4.fragment

但是我非常想知道如果我坚持使用动画方法有什么解决方案

A.D*_*ibo 8

删除动画文件中的 <set> 元素。我刚刚遇到了这个问题,当我删除它们时它就消失了。

我的动画xml:

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

Run Code Online (Sandbox Code Playgroud)


pet*_*ete 2

问题是因为 commit() 是异步的,并且可能是某些竞争条件导致闪烁。通过让事务管理器执行 commitNow() 而不是 commit() 来解决