Android 5.0 - 以编程方式将AppCompat v7 21主页图标从汉堡动画设置为后退箭头

时间:2014-11-04 20:21:22

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

我目前正在更新面向Fragment的应用(我有一个Activity,其中FrameLayout容器作为我Fragment的所有Fragment的主机。我想在替换AppCompat时将汉堡图标设置为后箭头。

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

由于this solution,我实现了这种效果,但是当Fragment被替换时,我无法弄清楚如何将ActionBarDrawerToggle作为后退按钮。

所以我的问题是:Fragement更换后,后箭头图标是否仍为onBackPressed()?在哪种情况下,如何覆盖它,使其像 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: getActivity().onBackPressed(); return true; } return false; } 一样,而不是打开抽屉?我已经尝试了这个,但它没有用:

{{1}}

提前致谢。

3 个答案:

答案 0 :(得分:7)

如果你手动打开它,我认为在抽屉里面跟踪更清洁。这就是我最终做的事情:

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

答案 1 :(得分:1)

此库的可绘制菜单有一个可以为状态设置动画的方法:

如果您想从Burger切换到Arrow,请拨打以下电话:

mMaterialMenu.animateState(IconState.ARROW);

答案 2 :(得分:1)

好的,所以我找到了办法。我很确定这不是一个好的解决方案,因为我使用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);
    }
}

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