汉堡菜单转箭头动画无法在编程中正常工作

3
我制作了一个服务器目录浏览应用程序,可以在Activity内部更改内容。我一直在添加一个功能:Navigation Drawer并处理Toolbar上的HamburgerBack图标,如下所示:
  • 主目录:
    1. 汉堡图标为默认状态。
    2. 点击汉堡或滑动手势会切换导航抽屉。
    3. 没有状态更改或汉堡的动画当抽屉被拉开时。
    4. 选择目录时汉堡转为返回图标的动画。
  • 任何子目录:
    1. 从前面的动画返回按钮的唯一目的是回到父目录。
    2. 滑动手势将滑动导航抽屉。
    3. 在手势滑动抽屉时或进入此目录的另一个子目录时更改或动画返回图标
    4. 使用返回图标或onBackPressed返回到主目录时后退箭头转为汉堡图标的动画。

我能够使用此答案得到汉堡转为返回图标的动画(以下代码原封不动地使用),但无法在回到主目录时再次获得汉堡图标(没有包含那段代码,而是采用了下一个方法)

ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator) {
        float slideOffset = (Float) valueAnimator.getAnimatedValue();
        mDrawerToggle.onDrawerSlide(drawerLayout, slideOffset);
    }
});
anim.setInterpolator(new DecelerateInterpolator());
// You can change this duration to more closely match that of the default animation.
anim.setDuration(500);
anim.start();

为了在从主目录和子目录之间浏览时适当切换汉堡包和返回图标,我参考了这个答案(如下代码),并成功地将其实现于主目录和子目录的1、2和3功能。

private void enableViews(boolean enable) {

    if(enable) {
        mDrawerToggle.setDrawerIndicatorEnabled(false);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        getSupportActionBar().setHomeButtonEnabled(true); // comment this line of code

        if(!mToolBarNavigationListenerIsRegistered) {
            mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Doesn't have to be onBackPressed
                    onBackPressed();
                }
            });
            mToolBarNavigationListenerIsRegistered = true;
        }
    }
    else {
        // Remove back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        getSupportActionBar().setHomeButtonEnabled(false); // comment this line of code

        // Show hamburger
        mDrawerToggle.setDrawerIndicatorEnabled(true);
        // Remove the/any drawer toggle listener
        mDrawerToggle.setToolbarNavigationClickListener(null);
        mToolBarNavigationListenerIsRegistered = false;
    }
}

现在来说说问题所在:在浏览目录时,从汉堡包图标切换到返回图标时,动画部分完全不起作用。但两个图标的状态都成功改变了,并且它们的功能也随之改变。如果需要更多信息进行故障排除,请告诉我。


你是启动一个新的活动来显示子目录,还是在同一个活动中使用新的片段? - Dibzmania
@Dibzmania 同样的活动。我只是在更新GridView(自定义带有图像+文本的GridView),在此过程中,我没有在此项目中使用任何类型的Fragment。我只是从互联网上收集了一些有用的文档,并将其拼凑在一起,理解解决方案并根据我的要求进行更新。尽管如此,我已经解决了它,并更新了答案以供将来参考。 - burglarhobbit
2个回答

1
如果您创建一个新项目,添加一个活动并使用模板NavigationDrawer(如果您使用Android Studio),则可以查看导航抽屉活动的工作示例。否则,请下载this repo
当我想学习新布局时,我只需加载模板,然后更改单个代码片段,直到获得所需内容。这样,您可以看到每个部分的功能,删除某些行会导致停止工作的内容以及应该如何完成事情。

1

我终于能够解决它了,在使用Android Studio的默认NavigationBarActivity进行调试后,深入了解了ActionBarDrawerToggle的行为。

  • The overriding of onDrawerSlide of the mDrawerToggle to block the animation of hamburger by the sliding drawer was the cause of the same blocking of animation of hamburger to arrow in the animatior function in the first place. Notice these two lines from the two different pieces of code (didn't include it earlier, but you get the idea):

    @Override
    public void onDrawerSlide(View view, float slideOffset) {
        // blocks the animation
        super.onDrawerSlide(view, 0);
    }
    
    // from the animator function above
    mDrawerToggle.onDrawerSlide(drawerLayout, slideOffset);
    

解决方案: 我删除了重写的onDrawerSlide函数,但是,滑动抽屉汉堡到箭头的动画也会回来。

对策: 我还发现汉堡到箭头的滑动抽屉动画是由这一行引起的:mDrawerLayout.setDrawerListener(mDrawerToggle),它又是一个已弃用的函数。所以我只是注释掉了这行代码,一切都按预期工作。


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