我使用在Android 5.0上运行的设备,minSdk
为21,targetSdk
为22。
应用说明
我在一个包含2项活动的应用中,活动A包含带有图片和文字的GridView
,活动B包含一个ImageView
,一个TextView
和一个片段。该片段包含与文本关联的图像列表。
单击活动A的图像时,会有一个共享元素转换,将图像和文本移动到活动B的ImageView
和TextView
。我还在活动A和活动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>
(我试过并没有区别)。
应用程序问题
我的问题涉及片段输入转换无法正常工作,而退出转换工作正常。 我尝试了不同的案例:
getWindow().setEnterTransition(new Fade());
getWindow().setExitTransition(new Fade());
结果与未定义明确的活动转换相同。
<item name="android:windowEnterTransition">@transition/fade</item>
<item name="android:windowExitTransition">@transition/fade</item>
结果是片段将通过淡入进入,并忽略Fragment.setEnterTransition()
。<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版本。
奖金错误:仍然是片段进入转换。在拥有我之前描述的应用之前,我尝试了一个没有共享元素转换的版本。如果我没有为活动B的TextView
设置转换名称,则该片段将永远不会有输入转换。但与之前相同,如果在onclicklistener方法中设置,它将起作用。我在Android 5.0.x上运行的2台设备上尝试过此操作,转换无效。我尝试使用Android 5.1.1的设备并且过渡工作(不改变代码中的任何内容)!仍然不知道发生了什么......
所以我的最后一个问题是:对这种行为有什么解释,有没有办法让它在不使用技巧的情况下工作?
答案 0 :(得分:3)
尝试在其OnCreate中添加片段的进入和退出转换。这似乎对我有用
答案 1 :(得分:-1)
使用FragmentTransaction类中的setCustomAnimations。
getFragmentManager()。的BeginTransaction() .setCustomAnimations(R.id.inAnim,R.id.outAnim,R.id.inAnim,R.id.outAnim) .replace(R.id.container,myFragment,MyFragment.TAG) .commit();
这样您就可以为每次转换定义一个动画。