【问题标题】:toolbar back button functionality工具栏后退按钮功能
【发布时间】:2015-07-01 20:54:09
【问题描述】:

我的工具栏和后退按钮有问题。这是我的设置:

当我添加细节片段时,我会按照here. 的概述为工具栏汉堡制作动画,这会导致汉堡制作成箭头动画。

即使在 cmets 部分,用户也提到:

这非常有效。只需设置 start=0 和 end=1 从汉堡包 到箭头,start=1 和 end=0 表示箭头到汉堡。一样东西 您必须跟踪抽屉何时关闭 箭头所示。此时,汉堡包最终被显示 (因为抽屉的滑轨),您必须更正。

但我不知道如何让后退箭头正常工作。当我按下后退箭头时,抽屉打开并且细节片段没有弹出。我应该如何实施?

问题

  • 添加细节片段时,我应该如何将汉堡包动画化到返回箭头?假设linked 解决方案不够好。
  • 如何覆盖后退箭头以仅执行我希望的特定功能?就像动画到汉堡包一样,弹出堆栈并打开抽屉。

【问题讨论】:

  • 精通问题,为你+1 兄弟

标签: android android-toolbar


【解决方案1】:

经过几个小时的搜索和尝试,我能够构建一个满足每个要求的解决方案。来源:1,2

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

【讨论】:

  • 这完美解决了我的大部分问题。仍然无法让汉堡包图标正确设置动画。
【解决方案2】:

您可以为此按钮设置监听器:

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
            }
        }

【讨论】:

  • 谢谢,这是正确的路线,但缺少一些细节。我最终找到了解决方案,请看我的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多