minSdk
为21,targetSdk
为22。
应用程序描述
我在一个包含两个活动的应用中,活动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);
nor
<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
上设置点击监听器,并仅在单击图像时添加片段,它起作用了!因此,我认为片段转换的时间与活动生命周期相比可能存在问题,所以我尝试将代码放在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版本。
额外的错误: 这仍然与片段进入转换有关。在拥有我之前描述的应用程序之前,我尝试了一个没有共享元素转换的版本。如果我不给Activity B的TextView
设置转换名称,片段将永远不会有进入转换。但和之前一样,如果在onclicklistener方法中设置,它就会起作用。我在运行Android 5.0.x的2个设备上尝试了这个方法,转换没有起作用。我在一个运行Android 5.1.1的设备上尝试了一下,转换起作用了(没有改变代码中的任何内容)!仍然不知道发生了什么...
所以我的最终问题是:这种行为的解释是什么,有没有办法使它不使用技巧也能工作?