6

我目前正在将一个Fragment面向应用程序(我有一个Activity容器FrameLayout作为我所有主机的主机Fragment)更新到 Material Design。我想在替换Fragment.

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

由于这个解决方案,我实现了这个效果,但是我不知道如何在替换ActionBarDrawerTogglea 时将其设置为后退按钮Fragment

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

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

提前致谢。

4

3 回答 3

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);
    }
}
于 2015-01-28T22:04:33.787 回答
1

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

如果你想从你切换BurgerArrow你做这个调用:

mMaterialMenu.animateState(IconState.ARROW);
于 2014-11-04T22:56:42.890 回答
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);
    }
}

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

于 2014-11-06T11:47:41.620 回答