【问题标题】:Fragment transaction animations lost when rotating screen旋转屏幕时片段交易动画丢失
【发布时间】:2015-02-20 09:03:56
【问题描述】:

当用户离开片段时,我会显示动画。为此,我正在使用支持包的setCustomAndimations
“popEnter”和“popExit”工作正常,但在活动旋转后它们会丢失,
即在没有动画的情况下发生旋转弹出片段之后。

在活动中创建片段:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    if (savedInstanceState == null) { // activity started for the first time, no fragment attached yet
        fragment = MyFragment.newInstance(params);
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setCustomAnimations(0, 0, // enter animations, not important here
        // when popping fragment -> these are lost on rotation
        R.anim.slide_in_right, R.anim.slide_out_right); 
        ft.add(R.id.content, fragment, MY_TAG).addToBackStack(null).commit();
    }
}

有没有办法/解决方法在旋转后保持动画“弹出”片段?

【问题讨论】:

    标签: android android-fragments android-animation


    【解决方案1】:

    我找到了这个问题的临时解决方案here(答案#3)

    通过添加以下内容来解决此问题: android:configChanges="方向|screenSize" 到清单中的 FragmentActivity。

    当然存在问题,即当您根据屏幕大小在 onCreateView 中膨胀不同的布局时。所以这也不是最终答案。

    编辑:您可以创建自己的后台堆栈:

    公共最终类 MBackStack {

    public static Stack<Fragment> fragStack = new Stack<>();
    
    private MBackStack(){}
    
    public static void addFragment(Fragment frag){
        fragStack.push(frag);
    }
    
    public static Fragment getFragment(){
        if (fragStack.isEmpty()) {
            return null;
        }
    
        fragStack.pop();
        Fragment fragment = fragStack.peek();
        return fragment;
    }
    
    public static int getStackSize(){
        return fragStack.size();
    }
    
    public static void clearStack(){
        while (fragStack.size()!=0){
            fragStack.pop();
        }
    }
    

    }

    现在代替

    ft.addToBackStack(null);
    

    您可以添加:

    YOURFRAGMENT yf = new YOURFRAGMENT();
    MBackStack.addFragment(yf);
    ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.content_frame, dts);
    ft.commit();
    

    在您的主要活动中,您可以覆盖您的 onbackpressed:

        @Override
    public void onBackPressed() {
    
        if(MBackStack.getStackSize()>1){
            ft = getSupportFragmentManager().beginTransaction();
            ft.setCustomAnimations(R.anim.in_left, R.anim.out_right);
            ft.replace(R.id.content_frame, MBackStack.getFragment());
            ft.commit();
        }else{
            finish();
            overridePendingTransition(R.anim.no_animation, R.anim.slide_bottom_out);
        }
    }
    

    我试过了,效果很好。

    【讨论】:

    • 这将完全防止方向更改,我仍然想保留它们。谢谢,无论如何,你的链接给我的印象是谷歌有一天会在 supportlib 中修复它,这是一个好消息!
    猜你喜欢
    • 1970-01-01
    • 2012-04-03
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 2013-11-30
    相关资源
    最近更新 更多