2014-10-20 4 views
33

Ich benutze die android.support.v7.widget.Toolbar mit einem android.support.v4.widget.DrawerLayout. Es funktioniert gut, das Burger-Symbol wird angezeigt, wenn das Navigationsfach geschlossen ist, und das Pfeilsymbol wird angezeigt, wenn das Fach geöffnet ist. Ich möchte die Schublade deaktivieren und das Burger-Symbol in Pfeil bei einigen Ereignissen in der App animieren. Ich habe versucht, den Sperrmodus zu schließen, aber der v7.app.ActionBarDrawerToggle zeigt immer noch den Burger und es öffnet die Schublade.Wie animieren Burger zu Pfeil mit Appcompat v7 21, Toolbar und DrawerLayout

mDrawerLayout.setDrawerLockMode (DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

Irgendwelche Ideen? Danke!

Update:

Nein kann ich den Zustand des Symbols ändern, und ich kann aktivieren/deaktivieren Sie die Schublade, aber die Animationen funktionieren nicht mit diesem Ansatz:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    Toolbar toolbar = (Toolbar) findViewById(R.id.application_toolbar); 
    setSupportActionBar(toolbar); 

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout); 
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.string1, R.string.string2) { 
     public void onDrawerClosed(View view) { 
      super.onDrawerClosed(view); 
     } 

     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
     } 
    }; 

    //mDrawerLayout.setDrawerListener(mDrawerToggle); // not needed 
    ... 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
     case android.R.id.home: 
      if (mDrawerLayout.getDrawerLockMode(GravityCompat.START) == LOCK_MODE_UNLOCKED) { 
       showDrawer(); 
      } else { 
       handleBackButtonPress(); // On this stage the home button is a <- 
      } 
    } 
    ... 
} 

private void setDrawerState(boolean isEnabled) { 
    if (isEnabled) { 
     mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); 
     mDrawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_UNLOCKED); 
     mDrawerToggle.syncState(); 

    } else { 
     mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
     mDrawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
     mDrawerToggle.syncState(); 
    } 
} 

Die Schublade kommt oben auf der Symbolleiste.

Antwort

36

Schauen Sie hier, es beschreibt, wie Sie es lösen.

https://stackoverflow.com/a/26447144

Der wesentliche Teil ist die folgende:

<style name="AppTheme" parent="Theme.AppCompat.Light"> 
    <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> 
+0

bitte eine Erklärung des Codes lassen .. – Haris

+1

Dank aber ich denke du verstehst meine Frage falsch. Ich möchte die Navigationsleiste vollständig deaktivieren (zur Laufzeit) und das Pfeilsymbol anstelle des Burgers anzeigen. – user2298916

+0

Ich habe das gleiche Problem keine Ahnung? –

29

ich eine kleine Anwendung erstellt, die

ähnliche Funktionalität hatte

MainActivity

public class MyActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my); 

     DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer); 
     android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar); 
     ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(
       this, 
       drawerLayout, 
       toolbar, 
       R.string.open, 
       R.string.close 
     ) 

     { 
      public void onDrawerClosed(View view) 
      { 
       super.onDrawerClosed(view); 
       invalidateOptionsMenu(); 
       syncState(); 
      } 

      public void onDrawerOpened(View drawerView) 
      { 
       super.onDrawerOpened(drawerView); 
       invalidateOptionsMenu(); 
       syncState(); 
      } 
     }; 
     drawerLayout.setDrawerListener(actionBarDrawerToggle); 

     //Set the custom toolbar 
     if (toolbar != null){ 
      setSupportActionBar(toolbar); 
     } 

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     actionBarDrawerToggle.syncState(); 
    } 
} 

Meine XML dieser Aktivität

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MyActivity" 
    android:id="@+id/drawer" 
    > 

    <!-- The main content view --> 
    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 
     <include layout="@layout/toolbar_custom"/> 
    </FrameLayout> 
    <!-- The navigation drawer --> 
    <ListView 
     android:layout_marginTop="?attr/actionBarSize" 
     android:id="@+id/left_drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:choiceMode="singleChoice" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="0dp" 
     android:background="#457C50"/> 


</android.support.v4.widget.DrawerLayout> 

My Custom Toolbar XML

<?xml version="1.0" encoding="utf-8"?> 

<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/toolbar" 
    android:background="?attr/colorPrimaryDark"> 
    <TextView android:text="U titel" 
     android:textAppearance="@android:style/TextAppearance.Theme" 
     android:textColor="@android:color/white" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     /> 
</android.support.v7.widget.Toolbar> 

My Theme Stil

<resources> 
    <style name="AppTheme" parent="Base.Theme.AppCompat"/> 

    <style name="AppTheme.Base" parent="Theme.AppCompat"> 
     <item name="colorPrimary">@color/primary</item> 
     <item name="colorPrimaryDark">@color/primaryDarker</item> 
     <item name="android:windowNoTitle">true</item> 
     <item name="windowActionBar">false</item> 
     <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> 

    <color name="primary">#457C50</color> 
    <color name="primaryDarker">#580C0C</color> 
</resources> 

Meine Styles in Werte-v21

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="AppTheme" parent="AppTheme.Base"> 
     <item name="android:windowContentTransitions">true</item> 
     <item name="android:windowAllowEnterTransitionOverlap">true</item> 
     <item name="android:windowAllowReturnTransitionOverlap">true</item> 
     <item name="android:windowSharedElementEnterTransition">@android:transition/move</item> 
     <item name="android:windowSharedElementExitTransition">@android:transition/move</item> 
    </style> 
</resources> 
+2

Ah, ich liebe dich. Ich mühte mich ab, die verdammte Pfeilanimation zu bekommen. Wenn Sie jedoch meinen Code finden, den ich gefunden habe, fehlt diese Zeile: drawerLayout.setDrawerListener (actionBarDrawerToggle); Jetzt funktioniert es wie ein Charme! – Kenneth

+2

plus Eins, für detaillierte Codes ... –

+0

Muss ActionBarActivity erweitert werden? – Skynet