【问题标题】:Android 5.0 - Animate the AppCompat v7 21 home icon from burger to back arrow programmaticallyAndroid 5.0 - 以编程方式将 AppCompat v7 21 主页图标从汉堡变为后退箭头
【发布时间】:2014-11-04 20:21:21
【问题描述】:

我目前正在将面向 Fragment 的应用程序(我有一个 Activity 和一个 FrameLayout 容器作为我所有 Fragments 的主机)更新到 Material Design。我想在替换Fragment 时将汉堡图标动画化为后退箭头。

基本上,如果这还不够清楚,here 就是我想要实现的目标。我不想使用this library (MaterialMenu),我想尽可能使用官方的AppCompat lib。

感谢this solution,我实现了这个效果,但是当Fragment 被替换时,我不知道如何将ActionBarDrawerToggle 作为后退按钮。

所以我的问题是:一旦Fragement 被替换,后退箭头图标是否仍然是ActionBarDrawerToggle?在这种情况下,我如何覆盖它,使其像onBackPressed() 而不是打开抽屉?我已经尝试过了,但它不起作用:

 @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch (item.getItemId())
        {
            case android.R.id.home:
                getActivity().onBackPressed();
                return true;
         }
         return false;
    }

提前致谢。

【问题讨论】:

    标签: android navigation-drawer android-5.0-lollipop android-appcompat drawertoggle


    【解决方案1】:

    我认为,无论您是否手动打开抽屉开关,在抽屉内进行跟踪会更干净一些。这就是我最终要做的:

    public class ManualActionBarDrawerToggle extends ActionBarDrawerToggle {
        private static final float MENU_POSITION = 0f;
        private static final float ARROW_POSITION = 1.0f;
    
        private final int animationLength;
        private final DrawerLayout drawerLayout;
        private final Activity activity;
        private State currentState;
    
        private enum State { UP_ARROW, MENU }
    
        public ManualActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, int openDrawerContentDescriptionResource, int closeDrawerContentDescriptionResource) {
            super(activity, drawerLayout, openDrawerContentDescriptionResource, closeDrawerContentDescriptionResource);
            animationLength = activity.getResources().getInteger(android.R.integer.config_shortAnimTime);
            this.drawerLayout = drawerLayout;
            this.activity = activity;
            currentState = State.MENU;
        }
    
        public void animateToBackArrow() {
            ValueAnimator anim = ValueAnimator.ofFloat(MENU_POSITION, ARROW_POSITION);
            anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                float slideOffset = (Float) valueAnimator.getAnimatedValue();
                onDrawerSlide(drawerLayout, slideOffset);
                }
            });
    
            anim.setInterpolator(new DecelerateInterpolator());
            anim.setDuration(animationLength);
            anim.start();
    
            currentState = State.UP_ARROW;
        }
    
        public void animateToMenu() {
            ValueAnimator anim = ValueAnimator.ofFloat(ARROW_POSITION, MENU_POSITION);
            anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator valueAnimator) {
                    float slideOffset = (Float) valueAnimator.getAnimatedValue();
                    onDrawerSlide(drawerLayout, slideOffset);
                }
            });
    
            anim.setInterpolator(new DecelerateInterpolator());
            anim.setDuration(animationLength);
            anim.start();
    
            currentState = State.MENU;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case (android.R.id.home):
                    if (currentState == State.UP_ARROW) {
                        activity.onBackPressed();
                        return true;
                    }
            }
            return super.onOptionsItemSelected(item);
        }
    }
    

    【讨论】:

    • 别忘了调用activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);在初始化一切之前
    【解决方案2】:

    这个库的菜单 drawable 有一个可以动画状态的方法:

    如果您想从 Burger 切换到 Arrow,请执行以下操作:

    mMaterialMenu.animateState(IconState.ARROW);
    

    【讨论】:

    • 确实,正如我所说,我已经使用了它,但 imo 它不如股票图标好看:)。
    • 那么,为什么不切换到 v7 ActionBarDrawerToggle 呢?
    • 嗯,我做了...?我想要的不是打开/关闭抽屉时的切换动画;这是相同的动画,但在切换片段时。一旦添加了 Fragment,我希望切换开关就像 home/back 箭头一样
    • 我们如何在 xml 中将默认 Menu Drawable 保持为 X 状态。我在活动中使用mMaterialMenu.animateState(IconState.X); 从默认的Burger 菜单切换到X 一个。但它会随着动画而改变。我没有找到任何属性来更改 xml 中的状态。请帮忙。
    【解决方案3】:

    好的,所以我想出了一个办法。我很确定这不是一个好的解决方案,因为我使用 ActionBarDrawerToggle 的目的与创建它的目的不同。

    但它有效,所以这就是我所做的。我只是创建了一个自定义的ActionBarDrawerToggle,在其中我覆盖了onOptionsItemSelected(...) 方法:

    class MyDrawerToggle extends ActionBarDrawerToggle
    {
        // ... Default constructors matching super go here
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item)
        {
            // If the back stack isn't empty, ie if I'm not in a Fragment 
            // accessible from the NavigationDrawer, I simulate the onBackPressed behaviour
            if (getFragmentManager().getBackStackEntryCount() != 0)
            {
                onBackPressed();
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }
    

    如果有人有更好的解决方案,请随时提出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 2015-01-15
      • 2017-06-11
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      相关资源
      最近更新 更多