工具栏返回按钮功能性

9
我遇到了工具栏和返回按钮的问题。以下是我的设置:

enter image description here

当我添加详细片段时,按照这里所述动画化工具栏汉堡包,这会导致汉堡包动画变成箭头。
即使在评论部分,用户也提到:

This works perfectly. Just set start=0 and end=1 to go from hamburger to arrow, and start=1 and end=0 for arrow to hamburger. One thing you'll have to keep track of is when the drawer is closed when the arrow is shown. At this point, the hamburger ends up being shown (because of the drawer's slide), which you'll have to correct.

但我无法弄清楚如何使后退箭头正常工作。当我按下返回箭头时,抽屉打开,详细片段未弹出。我应该如何实现这一点?

问题

  • 当添加详细片段时,我应该如何将汉堡包动画化为后退箭头?假设链接中的解决方案不够好。
  • 我如何覆盖返回箭头以执行我想要的特定功能,例如动画化为汉堡包、弹出后退堆栈并且打开抽屉?

精通问题,兄弟加一分 - Zaffar Saffee
2个回答

3

经过几个小时的搜索和尝试,我成功构建了一个满足所有要求的解决方案。参考资料:12

detailFragmentActive = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    setSupportActionBar(mToolbar);
    ...
    mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(detailFragmentActive) {
                        onBackPressed();
                        //if(displayBackAgain)
                        //return; //return after so you don't call syncState();
                    }else if (mDrawerLayou.isDrawerOpen(GravityCompat.START))
                        mDrawerLayout.closeDrawer(GravityCompat.START);
                    else
                        mDrawerLayout.openDrawer(GravityCompat.START);

                    mDrawerToggle.syncState();
                }
            });
}

private void animateHamburger(boolean isArrow){
        int start = 0, end = 1;

        if(isArrow){
            detailFragmentActive = false;
            start = 1; end = 0;
            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
        }else{
            detailFragmentActive = true;
            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        }
        ValueAnimator anim = ValueAnimator.ofFloat(start, end);
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                float slideOffset = (Float) valueAnimator.getAnimatedValue();
                mDrawerToggle.onDrawerSlide(mDrawerLayout, slideOffset);
            }
        });
        anim.setInterpolator(new DecelerateInterpolator());
        anim.setDuration(500);
        anim.start();
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    animateHamburger(true);
}

public void onFragmentChange(){
    ...
    animateHamburger(false);
}

这解决了我大部分的问题。但是还是无法使汉堡图标正确地进行动画。 - MidasLefko

1
您可以为此按钮设置监听器:
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (flagDeterminingAction) {
                drawerLayout.openDrawer(drawerListView);
            } else {
                onBackPressed();
               //or popbackstack or whatever you are using to going back in navigation
            }
        }

谢谢,这个方向是正确的,但是一些细节还缺失了。最终我找到了解决方案,请看我的回答。 - Android

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接