方向改变后,Android反向共享元素转换?

对于共享元素转换,我正在关注这个 github项目。 它有2个屏幕 – 一个与recyclerview有卡数量和第二个细节屏幕。 正如预期的那样,它展现了imageview&textview从recyclerview项目到详细的屏幕和背面的逆向转换的元素转换。

但是,如果用户在细节屏幕上改变方向,然后按下返回button,则反转过渡animation不起作用。 在2:49到2:57之间查看这个video帧,即使在方向改变之后,似乎也是可能的。 任何想法呢?

编辑:

请查看此video以获得更好的理解。

Solutions Collecting From Web of "方向改变后,Android反向共享元素转换?"

最后,我可以通过将单独的主题应用于细节屏幕覆盖以下属性值来修复此问题,但不知道为什么此参数更改了animation行为。

<item name="android:windowIsTranslucent">true</item> 

你必须设置:

 requestWindowFeature(Window.FEATURE_CONTENT_TRANSITIONS); requestWindowFeature(Window.FEATURE_ACTIVITY_TRANSITIONS); 

在调用和被调用的活动(在这个例子中MainActivity + NextActivity)。

我假设你打开NextActivity通过调用:

 ActivityOptions options = ActivityOptions. makeSceneTransitionAnimation(this, new Pair<View, String>(viewToAnimate, "animationName")); Intent intent = new Intent(MainActivity.this, NextActivity.class); startActivity(intent, options.toBundle()); 

在NextActivity中,您必须添加:

 animatingView.setTransitionName("animationName"); 

如果你这样做,如果你点击后退button,过渡将会起作用。

但是如果您打开设备并按下后退button,它将无法工作。

为了解决这个问题,我在第一个活动(本例中的MainActivity)中添加了这个问题:

 animatingView.setTransitionName("animationName"); 

系统现在知道屏幕旋转后要做什么animation。

我遇到了同样的问题,我怎么解决这个问题。

当RecyclerView项目被点击,我通过当前位置:

 @Override public void onItemClick(View sharedView, String transitionName, int position) { viewPosition = position; Intent intent = new Intent(this, TransitionActivity.class); intent.putExtra("transition", transitionName); ActivityOptionsCompat options = ActivityOptionsCompat. makeSceneTransitionAnimation(this, sharedView, transitionName); ActivityCompat.startActivity(this, intent, options.toBundle()); } 

我将它保存在onSaveInstanceState中以保持configuration更改:

 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(VIEW_POSITION, viewPosition); } 

然后,在onCreate方法中:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Workaround for orientation change issue if (savedInstanceState != null) { viewPosition = savedInstanceState.getInt(VIEW_POSITION); } setExitSharedElementCallback(new SharedElementCallback() { @Override public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) { super.onMapSharedElements(names, sharedElements); if (sharedElements.isEmpty()) { View view = recyclerView.getLayoutManager().findViewByPosition(viewPosition); if (view != null) { sharedElements.put(names.get(0), view); } } } }); } 

问题的原因:在方向更改之后,sharedElements图是空的(我不知道为什么)。

如果你进入“开发人员选项”,并启用“不要保持活动”,我想你会发现问题也会发生。 换句话说,问题不在于你正在旋转设备……但更普遍的是第一个活动在后台被破坏。

看看你的示例代码,它看起来像一个适配器做一些奇怪的东西(即饲料回收商查看新的网格项目从后台线程每隔50毫秒)? 我可以看到为什么这可能会导致您的一些问题…例如,如果调用活动被销毁,需要在用户点击后退button并且返回转换开始后立即重新创build? 如果共享元素返回转换开始,并且第一个活动中尚不存在所需的共享元素(例如,因为尚未由适配器添加),则转换将无法正常工作。

我想这应该是足够的信息,让你开始解决这个问题。