Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 配置更改后共享元素返回/重新输入转换中断_Android_Material Design_Android Transitions_Shared Element Transition - Fatal编程技术网

Android 配置更改后共享元素返回/重新输入转换中断

Android 配置更改后共享元素返回/重新输入转换中断,android,material-design,android-transitions,shared-element-transition,Android,Material Design,Android Transitions,Shared Element Transition,我有一个活动A和B,带有一个共享元素转换,它工作得很好,直到: 纵向从A->B过渡 在B中,将方向改为横向 回击 共享元素不知道返回到哪里,它只是愚蠢地在原地浮动,直到重新进入转换完成,然后消失 这看起来很尴尬。我理解这是因为最初共享元素连接到A的肖像风景,而不是风景。有什么办法可以减轻疼痛吗 我使用与上述完全相同的场景检查了Google Play store应用程序,从列表中选择一个应用程序,然后在方向更改后返回列表。它似乎只是在没有任何动画的情况下弹出到列表中,但这已经好得多了,因为至少没有

我有一个活动A和B,带有一个共享元素转换,它工作得很好,直到:

  • 纵向从A->B过渡
  • 在B中,将方向改为横向
  • 回击
  • 共享元素不知道返回到哪里,它只是愚蠢地在原地浮动,直到重新进入转换完成,然后消失
  • 这看起来很尴尬。我理解这是因为最初共享元素连接到A的肖像风景,而不是风景。有什么办法可以减轻疼痛吗

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


    更新:为了清楚起见,以下场景非常适合:

  • 纵向从A->B过渡
  • 在B中,将方向改为横向
  • 再次更改方向,返回到纵向
  • 回击
  • 共享元素完美地完成了它的工作,并返回到

  • 因此,这并不是视图在配置更改后无法保存的情况。

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

  • 在活动
    onCreate()
    中,创建或恢复保留原始屏幕方向的保留片段
  • 覆盖
    onBackPressed()
    并检查当前屏幕方向是否与原始屏幕方向相同。如果没有,只需完成活动(无转换)


  • 显然,修复原始问题会更好,但没有转换比损坏的转换更好。

    共享元素转换中包含的每个元素是否都有
    android:id
    ?你能出示你的代码吗?是的,我确实有,如果我在返回A之前切换回活动B中的纵向模式(因此,双方向改变,先切换到纵向,然后再切换到原始模式),一切正常。请告知,我是否正确理解问题的原因(在我的原始问题中陈述)?
    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);
        }
    }