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

Mat*_*ree 6 android android-appcompat navigation-drawer drawertoggle android-5.0-lollipop

我目前正在更新Fragment为导向的应用程序(我有一个ActivityFrameLayout容器作为主机为我所有Fragment或多个)材料设计.我想在替换时将汉堡图标设置为后箭头的动画Fragment.

基本上,如果这个不够清楚,就是我想要实现的目标.我不想使用这个库(MaterialMenu),我想使用官方的AppCompatlib来扩展可能.

由于这个解决方案,我实现了这个效果,但我无法弄清楚如何在更换ActionBarDrawerToggle时作为后退按钮Fragment.

所以我的问题是:如果后面的箭头图标仍然是替换ActionBarDrawerToggle后的那个图标Fragement吗?在这种情况下,我如何覆盖它,以便它的作用onBackPressed()而不是打开抽屉?我已经尝试了这个,但它不起作用:

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

提前致谢.

Gab*_*iel 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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Nik*_*ski 1

该库的可绘制菜单有一个可以对状态进行动画处理的方法:

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

mMaterialMenu.animateState(IconState.ARROW);
Run Code Online (Sandbox Code Playgroud)