我在如何确定Fragment事务何时实际完成方面存在一些问题。
问题是我的Fragment事务有一个持续250ms的动画,如果用户设法在动画完成之前按下backPress按钮,它会给我一张黑色地图。
这是我启动交易的代码
public void startTransactionAnimated(BaseFragment fragment, int startEnter, int startExit, int endEnter, int endExit) {
FragmentTransaction transaction = fm.beginTransaction();
transaction.setCustomAnimations(startEnter, startExit, endEnter, endExit);
transaction.replace(R.id.content_frame, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
fragmentHandler.startTransactionAnimated(toiletPageFragment,
R.anim.enter_from_right, R.anim.no_animation, R.anim.no_animation, R.anim.exit_to_right);
不同的动画都有250毫秒的持续时间。
普通视图:
黑色地图:
我尝试了getSupportFragmentManager().executePendingTransactions();
但没有任何结果。
答案 0 :(得分:2)
好的,我确实让它成功了。这是相当多的工作,但它已经完成!
这就是我所做的。
我有一个扩展Fragment的BaseFragment类。
protected void onAnimationStarted () {}
protected void onAnimationEnded () {}
protected void onAnimationRepeated () {}
@Override
public Animation onCreateAnimation (int transit, boolean enter, int nextAnim) {
//Check if the superclass already created the animation
Animation anim = super.onCreateAnimation(transit, enter, nextAnim);
//If not, and an animation is defined, load it now
if (anim == null && nextAnim != 0) {
anim = AnimationUtils.loadAnimation(getActivity(), nextAnim);
}
//If there is an animation for this fragment, add a listener.
if (anim != null) {
anim.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart (Animation animation) {
onAnimationStarted();
Log.i("TESTTAG", "ANIM STARTED: " );
}
@Override
public void onAnimationEnd (Animation animation) {
Log.i("TESTTAG", "ANIM END: " );
onAnimationEnded();
}
@Override
public void onAnimationRepeat (Animation animation) {
onAnimationRepeated();
}
});
}
return anim;
}
我在这里添加了这个。这样就可以覆盖我使用的片段中的 onAnimationStart 和 onAnimationEnded 。
@Override
protected void onAnimationStarted() {
super.onAnimationStarted();
isAnimationDone = false;
}
@Override
protected void onAnimationEnded() {
isAnimationDone = true;
super.onAnimationEnded();
}
这里我设置一个布尔值来查看动画是否实际结束。
然后在我的 backPress 片段中,我创建了一个自定义方法来捕获backPress事件,我添加了这段代码。
@Override
public void doBack() {
if (isAnimationDone){
getActivity().getSupportFragmentManager().popBackStack();
}
}
动画现在将完成,因此用户无法获得黑色地图问题。