6

Şu anda Malzeme Tasarımı olarak bir Fragment odaklı app (Ben bütün Fragment s için ev sahibi olarak bir FrameLayout konteyner ile bir Activity var) güncelliyorum ok geri burger AppCompat v7 21 ev simgesini canlandırın. Ve ben Fragment'u değiştirirken burger simgesini arka oka doğru canlandırmak istiyorum.Android 5.0 - programlı

Temel olarak, yeterince açık değilse, here elde etmek istediğim şeydir. this library (MaterialMenu)'u kullanmak istemiyorum, resmi AppCompat lib'ini mümkün olduğunca uzatmak istiyorum.

Bu etkiyi this solution sayesinde elde ettim, ancak Fragment değiştirildiği zaman ActionBarDrawerToggle bir geri düğmesi olarak nasıl yapılacağını anlayamıyorum.

Sorularım: Fragement değiştirildikten sonra geri ok simgesi hala ActionBarDrawerToggle olmalıdır? Hangi durumda onu nasıl geçersiz kılabilirim, böylece çekmeceyi açmak yerine onBackPressed() gibi davranıyor? Bunu zaten denedim ama işe yaramıyor:

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

Şimdiden teşekkürler. Bu kütüphanenin

cevap

1

Menü çekilebilir durumlarını canlandırabilirsiniz bir yöntem vardır:

mMaterialMenu.animateState(IconState.ARROW); 
+0

Gerçekten de, dediğim gibi, zaten kullandım ama imo, hisse senedi simgesinden daha iyi değil :). – MathieuMaree

+0

O zaman neden v7 ActionBarDrawerToggle'a geçmiyorsunuz? –

+0

Peki, ben ...? İstediğim, çekmeceyi açarken/kapatırken geçiş animasyonu değil; aynı animasyon ama parçaları değiştirirken. Ve Parça eklendiğinde açma/kapama düğmesi gibi davranmayı tercih ediyorum – MathieuMaree

1

Tamam ben bir yolunu:

Eğer bu çağrıyı yapmak Burger den Arrow geçmek istiyorsanız

. Bunun için yaratılmış olandan farklı bir amaç için ActionBarDrawerToggle kullanıyorum iyi bir çözüm değil eminim.

Ama işe yarıyor, işte yaptığım şey. Herkes daha iyi bir çözüm vardır

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

Eğer önermek çekinmeyin: Ben sadece onOptionsItemSelected(...) yöntemini geçersiz olduğu bir özel ActionBarDrawerToggle yarattı.

7

El ile açıp açmadıysanız, çekmecenin içinde geçiş yapmak için biraz daha temiz olduğunu düşünüyorum. Ben bu işi bitirdiğim şey şu:

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() öğesini çağırmayı unutmayın. SetDisplayHomeAsUpEnabled (true); Her şeyi başlatmadan önce –

İlgili konular