片段丢失的过渡动画配置更改后 [英] Fragment lost transition animation after configuration change

查看:267
本文介绍了片段丢失的过渡动画配置更改后的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用这个code片段插入到活动:

 公共无效的onCreate(包savedInstanceState)
{
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.main);

    FragmentManager FM = getFragmentManager();
    字符串变量=简单;

    片段FR = fm.findFragmentByTag(标签);
    如果(FR == NULL)
    {
        SimpleFragment simpleFragment =新SimpleFragment();
        FragmentTransaction交易= fm.beginTransaction();
        transaction.setCustomAnimations(android.R.animator.fade_in,android.R.animator.fade_out,
                                        android.R.animator.fade_in,android.R.animator.fade_out);
        transaction.add(R.id.main_layout,simpleFragment,标签);
        transaction.addToBackStack(标签);
        器transaction.commit();
    }
}
 

片段code是:

 公共类SimpleFragment扩展ListFragment
{
    @覆盖
    公共无效onActivityCreated(包savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        。getView()setBackgroundColor(Color.YELLOW);
    }
}
 

当我从弹出通过后退按钮backstack片段刚发射后不管,那么一切都很好,我可以看到淡出动画。但是,如果我旋转设备和preSS后退按钮,然后片段消失,没有动画。

这是Android的行为,或者说我做错了什么?

编辑: 看来,旋转后FragmentManager没有恢复动画(enterAnim,exitAnim,popEnterAnim和popExitAnim)为BackStackEntry。

FragmentManager转储(不转动):​​

 活性片段在4087d668:
  #0:SimpleFragment {408883b0#0 ID = 0x7f050000简单}
    mFragmentId =#7f050000 mContainerId#= 7f050000 MTAG =简单
    mState = 4 MINDEX = 0 mWho =机器人:片段:0 mBackStackNesting = 1
    mAdded =真mRemoving =假mResumed =真mFromLayout =假mInLayout = FALSE
    mHidden =假mDetached =假mRetainInstance =假mRetaining =假mHasMenu = FALSE
    mFragmentManager = FragmentManager {在ListViewFragmentsActivity 4087d668 {4087d588}}
    mImmediateActivity=my.app.ListViewFragmentsActivity@4087d588
    mActivity=my.app.ListViewFragmentsActivity@4087d588
    mNextAnim = 17498112
    mContainer=android.widget.RelativeLayout@408876d8
    mView=android.widget.FrameLayout@40888a70
新增片段:
  #0:SimpleFragment {408883b0#0 ID = 0x7f050000简单}
后退堆栈:
  #0:android.app.BackStackRecord@408884b8
    MNAME =简单MINDEX = 0 mCommitted =真
    mEnterAnim =#10b0000 mExitAnim =#10b0001
    操作:
      欧普#0:
        CMD = 1片段= SimpleFragment {408883b0#0 ID = 0x7f050000简单}
    enterAnim = 17498112 exitAnim = 17498113
    popEnterAnim = 17498112 popExitAnim = 17498113
返回堆栈指数:
  #0:android.app.BackStackRecord@408884b8
FragmentManager其它国家:
  mCurState = 5 mStateSaved =假mDestroyed = FALSE
 

FragmentManager转储(旋转后):

 活性片段在40877f38:
  #0:SimpleFragment {40878858#0 ID = 0x7f050000简单}
    mFragmentId =#7f050000 mContainerId#= 7f050000 MTAG =简单
    mState = 4 MINDEX = 0 mWho =机器人:片段:0 mBackStackNesting = 1
    mAdded =真mRemoving =假mResumed =真mFromLayout =假mInLayout = FALSE
    mHidden =假mDetached =假mRetainInstance =假mRetaining =假mHasMenu = FALSE
    mFragmentManager = FragmentManager {在ListViewFragmentsActivity 40877f38 {40877e58}}
    mImmediateActivity=my.app.ListViewFragmentsActivity@40877e58
    mActivity=my.app.ListViewFragmentsActivity@40877e58
    mContainer=android.widget.RelativeLayout@4087ed50
    mView=android.widget.FrameLayout@4087fc00
新增片段:
  #0:SimpleFragment {40878858#0 ID = 0x7f050000简单}
后退堆栈:
  #0:android.app.BackStackRecord@40878a78
    MNAME =简单MINDEX = 0 mCommitted = FALSE
    操作:
      欧普#0:
        CMD = 1片段= SimpleFragment {40878858#0 ID = 0x7f050000简单}
返回堆栈指数:
  #0:android.app.BackStackRecord@40878a78
FragmentManager其它国家:
  mCurState = 5 mStateSaved =假mDestroyed = FALSE
 

解决方案

作为一种解决方法,您可以使用您的片段onCreateAnimator / onCreateAnimation方法。

例如原生片段实施:

  @覆盖
公共动画onCreateAnimator(INT中转,布尔输入,诠释nextAnim){
    如果(进入){
        返回AnimatorInflater.loadAnimator(getActivity(),R.animator.slide_in_top);
    } 其他 {
        返回AnimatorInflater.loadAnimator(getActivity(),R.animator.fade_out);
    }
}
 

同样的技术支持库片段,动画代替。在这种情况下,你还可以更好地控制你想根据片段状态和/或参数播放动画。

I'm inserting Fragments into the Activity using this code:

public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    FragmentManager fm = getFragmentManager();
    String tag = "simple";

    Fragment fr = fm.findFragmentByTag(tag);
    if (fr == null)
    {
        SimpleFragment simpleFragment = new SimpleFragment(); 
        FragmentTransaction transaction = fm.beginTransaction();
        transaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out,
                                        android.R.animator.fade_in, android.R.animator.fade_out);
        transaction.add(R.id.main_layout, simpleFragment, tag);
        transaction.addToBackStack(tag);
        transaction.commit();
    }
}

Fragments code is:

public class SimpleFragment extends ListFragment 
{
    @Override
    public void onActivityCreated(Bundle savedInstanceState) 
    {
        super.onActivityCreated(savedInstanceState);
        getView().setBackgroundColor(Color.YELLOW);
    }
}

When I pop the fragment from backstack via Back button just after launching, then everything is fine and I can see fade out animation. But if I rotate device and press Back button then fragment disappears without animation.

Is this Android behavior or I'm doing something wrong?

EDIT: It seems that after rotation FragmentManager didn't restores animations (enterAnim, exitAnim, popEnterAnim and popExitAnim) for BackStackEntry.

FragmentManager dump (without rotation):

Active Fragments in 4087d668:
  #0: SimpleFragment{408883b0 #0 id=0x7f050000 simple}
    mFragmentId=#7f050000 mContainerId#=7f050000 mTag=simple
    mState=4 mIndex=0 mWho=android:fragment:0 mBackStackNesting=1
    mAdded=true mRemoving=false mResumed=true mFromLayout=false mInLayout=false
    mHidden=false mDetached=false mRetainInstance=false mRetaining=false mHasMenu=false
    mFragmentManager=FragmentManager{4087d668 in ListViewFragmentsActivity{4087d588}}
    mImmediateActivity=my.app.ListViewFragmentsActivity@4087d588
    mActivity=my.app.ListViewFragmentsActivity@4087d588
    mNextAnim=17498112
    mContainer=android.widget.RelativeLayout@408876d8
    mView=android.widget.FrameLayout@40888a70
Added Fragments:
  #0: SimpleFragment{408883b0 #0 id=0x7f050000 simple}
Back Stack:
  #0: android.app.BackStackRecord@408884b8
    mName=simple mIndex=0 mCommitted=true
    mEnterAnim=#10b0000 mExitAnim=#10b0001
    Operations:
      Op #0:
        cmd=1 fragment=SimpleFragment{408883b0 #0 id=0x7f050000 simple}
    enterAnim=17498112 exitAnim=17498113
    popEnterAnim=17498112 popExitAnim=17498113
Back Stack Indices:
  #0: android.app.BackStackRecord@408884b8
FragmentManager misc state:
  mCurState=5 mStateSaved=false mDestroyed=false

FragmentManager dump (after rotation):

Active Fragments in 40877f38:
  #0: SimpleFragment{40878858 #0 id=0x7f050000 simple}
    mFragmentId=#7f050000 mContainerId#=7f050000 mTag=simple
    mState=4 mIndex=0 mWho=android:fragment:0 mBackStackNesting=1
    mAdded=true mRemoving=false mResumed=true mFromLayout=false mInLayout=false
    mHidden=false mDetached=false mRetainInstance=false mRetaining=false mHasMenu=false
    mFragmentManager=FragmentManager{40877f38 in ListViewFragmentsActivity{40877e58}}
    mImmediateActivity=my.app.ListViewFragmentsActivity@40877e58
    mActivity=my.app.ListViewFragmentsActivity@40877e58
    mContainer=android.widget.RelativeLayout@4087ed50
    mView=android.widget.FrameLayout@4087fc00
Added Fragments:
  #0: SimpleFragment{40878858 #0 id=0x7f050000 simple}
Back Stack:
  #0: android.app.BackStackRecord@40878a78
    mName=simple mIndex=0 mCommitted=false
    Operations:
      Op #0:
        cmd=1 fragment=SimpleFragment{40878858 #0 id=0x7f050000 simple}
Back Stack Indices:
  #0: android.app.BackStackRecord@40878a78
FragmentManager misc state:
  mCurState=5 mStateSaved=false mDestroyed=false

解决方案

As a workaround for this you can use onCreateAnimator/onCreateAnimation methods in your fragments.

For example for native fragments implementation:

@Override
public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
    if (enter) {
        return AnimatorInflater.loadAnimator(getActivity(), R.animator.slide_in_top);
    } else {
        return AnimatorInflater.loadAnimator(getActivity(), R.animator.fade_out);
    }
}

The same technique for support library fragments with Animation instead. In this case you also have more control over how would you like to play animation depending upon fragment state and/or arguments.

这篇关于片段丢失的过渡动画配置更改后的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆