片段交易与动画黑色谷歌地图

时间:2017-09-14 11:15:06

标签: android google-maps android-fragments

我在如何确定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毫秒的持续时间。

普通视图:

Normal View

黑色地图:

Black Map

我尝试了getSupportFragmentManager().executePendingTransactions();但没有任何结果。

1 个答案:

答案 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();
    }
}

动画现在将完成,因此用户无法获得黑色地图问题。