【问题标题】:Shared element return / reenter transition broken after configuration change配置更改后共享元素返回/重新进入转换中断
【发布时间】:2016-09-01 21:11:12
【问题描述】:

我有活动 A 和 B,有一个共享的元素转换,效果很好,直到:

  1. 纵向从 A -> B 转换
  2. 在 B 中,将方向更改为横向
  3. 反击
  4. 共享元素不知道从哪里返回,它只是愚蠢地漂浮在它的位置,直到重新进入过渡完成,然后消失

这看起来很尴尬。我理解这是因为最初共享元素连接到 A 的纵向风景,而不是风景之一。有什么办法可以减轻疼痛吗?

我使用与上述完全相同的场景检查了 Google Play 商店应用,从列表中选择了一个应用,然后在方向更改后返回列表。它似乎只是在没有任何动画的情况下弹回列表,但这已经好很多了,因为至少没有损坏的过渡和浮动元素。实现这种行为的方法是什么?


更新:为了清楚起见,以下场景可以完美运行

  1. 纵向从 A -> B 转换
  2. 在 B 中,将方向更改为横向
  3. 再次改变方向,回到纵向
  4. 反击
  5. 共享元素完美完成其工作并返回到 A

所以这不是视图无法在配置更改后继续存在的情况。

【问题讨论】:

  • 您的共享元素转换中包含的每个元素是否都有android:id?你能展示你的代码吗?
  • 是的,我确实有,如果我在活动 B 中切换回纵向模式,一切正常(因此,双方向更改,首先是纵向,然后返回原始模式),然后再返回 A。请告知,我是否理解问题的原因(在我原来的问题中说明)?

标签: android material-design android-transitions shared-element-transition


【解决方案1】:

我正在回答我自己的问题,至少是关于如何在方向改变后不经过转换而返回到上一个活动的部分。

  1. 在ActivityonCreate()中,创建或恢复一个保留原屏幕方向的Fragment
  2. 覆盖onBackPressed() 并检查当前屏幕方向是否与原始屏幕方向相同。如果没有,只需完成 Activity(无过渡)。

    private State state;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initState();
    }
    
    private void initState() {
        String tag = "state";
        FragmentManager fm = getFragmentManager();
    
        // find or create fragment
        this.state = (State) fm.findFragmentByTag(tag);
        if (this.state == null) {
            this.state = new State();
            fm.beginTransaction().add(this.state, tag).commit();
    
            // store original screen orientation
            this.state.originalOrientation = getResources().getConfiguration().orientation;
        }
    }
    
    @Override
    public void onBackPressed() {
        // shared element would be broken
        if (getResources().getConfiguration().orientation != state.originalOrientation) {
            // no transition
            finish();
    
        } else {
            // default behavior
            super.onBackPressed();
        }
    }
    
    public static class State extends Fragment {
        private int originalOrientation;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setRetainInstance(true);
        }
    }
    

解决原来的问题显然会更好,但没有任何过渡总比坏掉的好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 2012-04-30
    • 2017-05-15
    • 1970-01-01
    • 2019-05-22
    相关资源
    最近更新 更多