我在如何确定 fragment 事务何时实际完成方面遇到一些问题。
问题是我的 Fragment 事务有一个持续 250ms 的动画,如果用户在动画完成之前按下 backPress 按钮,它会给我一张黑色的 map 。
这是我启动交易的代码
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 毫秒的持续时间。
普通 View :
黑色 map :
我尝试过getSupportFragmentManager().executePendingTransactions();
但没有任何结果。
最佳答案
好吧,我确实成功了。这是一项相当大的工作,但已经完成了!
这就是我所做的。
我有一个扩展 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;
}
这里我添加了这个。这使得在我使用的 fragment 中覆盖 onAnimationStart 和 onAnimationEnded 成为可能。
@Override
protected void onAnimationStarted() {
super.onAnimationStarted();
isAnimationDone = false;
}
@Override
protected void onAnimationEnded() {
isAnimationDone = true;
super.onAnimationEnded();
}
这里我设置了一个 bool 值来查看动画是否真的结束了。
然后在 fragment 中的 backPress 上(这是我为捕获 backPress 事件而创建的自定义方法),我添加了以下代码。
@Override
public void doBack() {
if (isAnimationDone){
getActivity().getSupportFragmentManager().popBackStack();
}
}
动画现在将完成,因此用户无法解决黑色 map 问题。
关于android - 带动画的 fragment 交易使谷歌地图变黑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46217631/