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

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

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

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

感谢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;
    }

提前致谢。

最佳答案

我认为无论您是否手动打开抽屉开关,在抽屉开关内部进行追踪都会更清晰一些。这就是我最终做的:

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

关于Android 5.0 - 以编程方式将 AppCompat v7 21 主页图标从汉堡动画化为后退箭头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26744299/

相关文章:

android - ListView 使我的应用程序崩溃

android - 单击 NavigationDrawer 不打开 Bottom Sheet

android-5.0-lollipop - HAXM 和 Lollipop

java - 无法使用某些 L SDK 功能

android - 获取已连接的蓝牙 LE 设备列表

java - 意外字符 $ - Java 绑定(bind)错误

android - 上传/下载文件 CloudRail Android/Dropbox

android - 我们可以更改 facebook 上链接的图像(由 android 应用程序发布)吗

android - 弃用的 ActionBarDrawerToggle

android - 抽屉导航菜单项中的按钮不起作用