【问题标题】:Fragment transaction with animation blacks out google map带有动画的片段交易使谷歌地图变黑
【发布时间】:2017-09-14 11:15:06
【问题描述】:

我在如何确定 Fragment 事务何时真正完成时遇到了一些问题。

问题是我的 Fragment 事务有一个持续 250 毫秒的动画,如果用户设法在动画完成之前按下 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();,但没有任何结果。

【问题讨论】:

    标签: android google-maps android-fragments


    【解决方案1】:

    好吧,我确实做到了。这是相当多的工作,但它完成了!

    这就是我所做的。

    我有一个扩展 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;
    }
    

    我在这里添加了这个。这使得覆盖我使用的片段中的 onAnimationStartonAnimationEnded 成为可能。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      相关资源
      最近更新 更多