我有活动A和B,共享元素转换,效果很好,直到:
这看起来很尴尬。我理解这是因为最初共享元素连接到A的纵向景观,而不是景观景观。可以采取一切措施来缓解疼痛吗?
我使用与上述完全相同的方案检查了Google Play商店应用,从列表中选择了一个应用,然后在方向更改后返回列表。它似乎只是弹回到列表而没有任何动画,但这已经好多了,因为至少没有破坏的过渡和浮动元素。实现这种行为的方法是什么?
更新:为了明确说明,以下方案完全正常:
因此,视图不会在配置更改后继续存在。
答案 0 :(得分:1)
我正在回答我自己的问题,至少是关于如何在方向改变后没有过渡而回到之前的活动的部分。
onCreate()
中,创建或恢复保留原始屏幕方向的保留片段覆盖onBackPressed()
并检查当前屏幕方向是否与原始屏幕方向相同。如果没有,只需完成活动(无转换)。
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);
}
}
解决原始问题显然会更好,但没有任何过渡比破坏过程更好。