【发布时间】:2015-08-21 03:02:57
【问题描述】:
我使用的是运行 Android 5.0 的设备,minSdk 是 21,targetSdk 是 22。
应用说明
我在一个有 2 个活动的应用上,活动 A 包含一个带有图片和文本的 GridView,活动 B 包含一个 ImageView、一个 TextView 和一个片段。此片段包含与文本关联的图像列表。
当点击活动A的图像时,有一个共享元素过渡,将图像和文本移动到活动B的ImageView和TextView。我还在活动A和B之间设置了淡入淡出过渡。片段在onCreate() 方法中动态添加到活动B。我设置和进入和退出过渡到片段:
MyFragment myFragment = new MyFragment();
myFragment.setEnterTransition(new Slide());
myFragment.setExitTransition(new Slide);
getFragmentManager().beginTransaction()
.add(R.id.container, myFragment, MyFragment.TAG)
.commit();
关于片段退出过渡,我使用了一个技巧,当按下返回按钮时,我将片段替换为另一个片段以强制它:
@Override
public void onBackPressed() {
if (myFragment.isVisible()) {
getFragmentManager().beginTransaction()
.replace(R.id.container, new Fragment())
.commit();
}
super.onBackPressed();
}
我的应用程序的主题是Theme.Material 的孩子所以我没有定义
getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
也没有
<item name="android:windowActivityTransitions">true</item>
<item name="android:windowContentTransitions">true</item>
(我试过了,没有任何区别)。
应用问题
我的问题涉及片段进入转换无法正常工作,而退出转换工作正常。 我尝试了不同的案例:
- 没有明确定义的活动过渡:没有进入过渡,在播放共享元素过渡时片段已经存在。
- 在活动 A 和 B 中使用 java 定义活动转换:
getWindow().setEnterTransition(new Fade()); getWindow().setExitTransition(new Fade());结果与未定义明确的活动转换相同。 - 使用 XML 定义活动转换:
<item name="android:windowEnterTransition">@transition/fade</item> <item name="android:windowExitTransition">@transition/fade</item>结果是片段将通过淡入淡出进入,Fragment.setEnterTransition()被忽略。 - 在 XML 中定义片段输入转换:
<item name="android:fragmentEnterTransition">@transition/fade</item>结果是它被完全忽略了,之前的所有情况都会发生同样的情况。
我尝试了其他方法使其像这样工作:myFragment.setAllowEnterTransitionOverlap(false); 但没有...
我还尝试在ImageView 上设置一个单击侦听器,并仅在单击图像时添加片段并且它起作用了!由此,我认为与activity生命周期相比,fragment转换的时间可能有问题,所以我尝试将代码放在onResume()方法中,但仍然没有。
然后我尝试使用postDelayed() 方法:
MyFragment myFragment = new MyFragment();
myFragment.setEnterTransition(new Slide());
myFragment.setExitTransition(new Slide);
mImageView.postDelayed(new Runnable() {
@Override
public void run() {
getFragmentManager().beginTransaction()
.add(R.id.container, myFragment, MyFragment.TAG)
.commit();
}
}, 1000);
它也有效!
最后我尝试添加一个空片段,然后将其替换为myFragment:
MyFragment myFragment = new MyFragment();
myFragment.setEnterTransition(new Slide());
myFragment.setExitTransition(new Slide);
getFragmentManager().beginTransaction()
.add(R.id.container, new Fragment)
.commit();
getFragmentManager().beginTransaction()
.replace(R.id.container, myFragment, MyFragment.TAG)
.commit();
但还是什么都没有……
所以现在我想知道是否有什么我想在不使用技巧的情况下让它工作的东西......而且我知道它可以工作,因为我可能在 5 个月前开始在应用程序上工作,它是在职的!!所以我不知道发生了什么,我没有更新我的 Android 版本。
Bonus bug:仍然是关于片段进入过渡的问题。在拥有我之前描述的应用程序之前,我尝试了一个没有共享元素转换的版本。而且如果我不给Activity B 的TextView 设置一个transition 名字,fragment 就永远不会有enter 的transition。但和以前一样,如果在 onclicklistener 方法中设置,它将起作用。我在运行 Android 5.0.x 的 2 台设备上尝试了此操作,但转换无法正常工作。我在装有 Android 5.1.1 的设备上进行了尝试,并且转换成功(没有更改代码中的任何内容)!仍然不知道发生了什么......
所以我的最后一个问题是:这种行为的解释是什么?有没有办法让它在不使用技巧的情况下工作?
【问题讨论】:
-
我想我遇到了类似的问题。唯一的区别是我陷入了退出过渡。你有没有解决这个问题?
-
这里也一样,使用 onCreate 对我来说没有答案,因为我正在向 RecyclerView 添加一些幻灯片过渡,并在视图中循环显示。我的问题是当我有 appbarLayout enterTransition 不起作用时,如果我删除它,它就会开始工作。你还没有见过像这样有问题的 API,而且文档记录也很差。
标签: android android-fragments android-animation android-5.0-lollipop android-transitions