安卓5.0-动画的AppCompat v7 21主页图标从汉堡向后箭头编程



我目前正在将一个面向Fragment的应用程序(我有一个ActivityFrameLayout容器作为我所有Fragment的主机)更新为Material Design。当替换Fragment时,我想将汉堡图标设置为后箭头。

基本上,如果这还不够清楚的话,这里就是我想要实现的。我不想使用这个库(MaterialMenu),我想尽可能使用官方的AppCompat库。

由于此解决方案,我实现了此效果,但我不知道如何在更换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;
    }

提前谢谢。

我认为,如果您手动或未手动打开抽屉开关,跟踪抽屉开关内部会更干净一些。这就是我最终所做的:

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

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

如果你想从Burger切换到Arrow,你可以打这个电话:

mMaterialMenu.animateState(IconState.ARROW);

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

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

相关内容

  • 没有找到相关文章

最新更新