11

Ich benutze das ActionBarDrawerToggle aus der Appcompat-Bibliothek von v7 in meiner App und habe Probleme mit der Animation von Menü zu Pfeil. Gemäß den Richtlinien für das Materialdesign sollte die Navigationsleiste die Symbolleiste überlappen und die Symbolanimation sollte nicht verwendet werden, wenn die Schublade geöffnet wird.ActionBarDrawerToggle animation

Warum ist die Animation beim Öffnen/Schließen der Navigationsleiste standardmäßig aktiviert und wie kann ich sie deaktivieren?

Auch, wie kann ich die Animation bei anderen Vorkommen auslösen? Ich fand this solution, aber es funktioniert nur für Android API 11+ und seine überschrieben durch Aufruf von setDrawerIndicatorEnabled(false) oder durch eine erweiterte ActionView in der Symbolleiste.

Antwort

16

Wenn Sie Ihre ActionBarDrawerToggle erstellen, tun es so um die Animation/Pfeil zu deaktivieren und zeigen immer einen Hamburger:

drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, 
      getToolbar(), R.string.open, R.string.close) { 

     @Override 
     public void onDrawerClosed(View view) { 
      super.onDrawerClosed(view); 
     } 

     @Override 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      super.onDrawerSlide(drawerView, 0); // this disables the arrow @ completed state 
     } 

     @Override 
     public void onDrawerSlide(View drawerView, float slideOffset) { 
      super.onDrawerSlide(drawerView, 0); // this disables the animation 
     } 
    }; 
+0

Eigentlich müssten Sie nur die 'onDrawer *() 'Methoden überschreiben, ohne ihre' super' Methoden aufzurufen. Keine Notwendigkeit für die zusätzliche 'super.onDrawerSlide (drawerView, 0); Anrufe. Wenn Sie die Überschreibungen jedoch nicht für andere Zwecke verwenden, d. H. Wenn sie nur leer sind, können Sie den Schalter nicht einfach als 'DrawerListener' festlegen, wie in einer anderen Antwort hier erwähnt. –

1

Fügen Sie DrawerArrowStyle in Ihrem Theme wie oben hinzu. Es funktioniert der Trick ...

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar"> 
    <!-- Customize your theme here. --> 
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> 
</style> 

<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> 
    <item name="spinBars">true</item> 
    <item name="color">@android:color/white</item> 
</style> 

Beispielaktivität

public class MainActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar); 
    DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(
     this, mDrawerLayout, mToolbar, 
     R.string.navigation_drawer_open, R.string.navigation_drawer_close 
    ); 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 
    mDrawerToggle.syncState(); 
} 
+0

Was genau sollte sich das ändern? Ich habe immer noch die Animation beim Öffnen der Schublade und habe es nicht, wenn ich es will. – Makru

+1

Wenn Sie es deaktivieren möchten. Setzen Sie dies auf false false AruLNadhaN

+0

Das zeigt immer noch die Animation, ohne dass sich die Balken drehen. – Makru

1

Ich weiß, ich bin super spät ...

Führen Sie dies in der Aktivität aus:

drawerToggle.setDrawerIndicatorEnabled(false); 

In styles.xml Thema. Tun Sie dies:

<item name="android:homeAsUpIndicator">@drawable/menu_icon</item> 
4

ich auf dieses Problem tooday kam und fand einfach und (I belive) eine richtige Lösung:

einfach nicht setzen ActionBarDrawerToggle Instanz als DrawerListener für Ihre DrawerLayout. Auf diese Weise führt ActionBarDrawerToggle keine Animation durch, die von der Verschiebung der Auszugsfolie abhängig ist.

Wenn Sie einen Listener für DrawerLayout benötigen, verwenden Sie DrawerLayout.DrawerListener.

edit: Sie auch ActionBarDrawerToggle als Zuhörer einstellen können, aber als man seine onDrawerSlide Methode overide müssen. z.B. dies wie:

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open_desc, R.string.drawer_close_desc) { 
     @Override 
     public void onDrawerSlide(View drawerView, float slideOffset) { 
      super.onDrawerSlide(drawerView, 0); 
     } 
    }; 

super.onDrawerSlide() mit 0 Wert Aufruf statt slideOffset, deaktiviert die Animation

0
mDrawerToggle = new ActionBarDrawerToggle(
       this, 
       mDrawerLayout, 
       mToolbar, 
       R.string.drawer_open, 
       R.string.drawer_close 
     ) { 
      public void onDrawerClosed(View view) { 
       super.onDrawerClosed(view); 
       invalidateOptionsMenu(); 
       syncState(); 

      } 


      public void onDrawerOpened(View drawerView) { 
       super.onDrawerOpened(drawerView); 
       invalidateOptionsMenu(); 
       syncState(); 
       mLeftMenuFrame.bringToFront(); 
       mRightMenuFrame.bringToFront(); 

      } 
     }; 


     mDrawerToggle.setDrawerIndicatorEnabled(true); 
     mDrawerLayout.setDrawerListener(mDrawerToggle); 

     mToolbar.inflateMenu(R.menu.menu_main); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     mDrawerToggle.syncState();