6

我目前正在更新Fragment面向应用程序(我有一个ActivityFrameLayout容器作为主机为我所有Fragment多个)材料设计。在替换Fragment时,我想将汉堡图标制作成后箭头。的是Android 5.0 - 从汉堡动画的程序兼容性V7 21家图标后退箭头编程

基本上,如果这不够清楚,here是我想达到的。我不想用this library (MaterialMenu),我想用官方的AppCompat lib来扩展可能。

由于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; 
    } 

在此先感谢。这个库的

回答

1

菜单绘制有可以激活状态的方法:

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

mMaterialMenu.animateState(IconState.ARROW); 
+0

确实,正如我所说的,我已经使用过它,但是它不像股票图标那么好看:)。 – MathieuMaree 2014-11-04 23:00:54

+0

然后,为什么不切换到v7的ActionBarDrawerToggle? – 2014-11-04 23:02:46

+0

嗯,我没有...?我想要的不是打开/关闭抽屉时的切换动画;这是相同的动画,但切换片段时。我希望一旦添加了片段,切换就像家庭/后退箭头一样操作 – MathieuMaree 2014-11-04 23:06:11

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

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

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

不要忘记调用activity.getSupportActionBar()。setDisplayHomeAsUpEnabled(true); 初始化所有内容之前 – 2017-05-25 07:21:27

相关问题