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

相關問題