2016-06-12 11 views
3

Ich habe eine Actionbar von android.support.v7.widget.Toolbar. Es hat Hamburgerbild mit Animation, um Pfeil zurückzugehen, ich will zurück Pfeil von < ändern - zu ->. Wie kann ich das in Android Studio tun?zurück ändern arrow image in Actionbar mit appcompat-v7

Ich habe irgendwo gelesen, um es mit setHomeAsUpIndicator() Methode zu ändern, aber es ändern Hamburger-Taste und es hat keine Animation zurück Pfeil.

+1

Bildvisualisierung wird hilfreich sein –

Antwort

2

Es gibt mindestens ein halbes Dutzend Möglichkeiten, dies zu tun, aber wahrscheinlich die einfachste und kürzeste Reflektion verwendet die ActionBarDrawerToggle ‚s Drawable, zu greifen und seine Richtung drehen.

Dieses Beispiel umschließt diese Funktionalität in einer Unterklasse und sollte unabhängig von Ihrer ActionBar/Activity Konfiguration funktionieren (vorausgesetzt, die ursprüngliche Klasse funktionierte dort an erster Stelle).

public class FlippedDrawerToggle extends ActionBarDrawerToggle { 
    public FlippedDrawerToggle(Activity activity, DrawerLayout drawerLayout, 
     int openDrawerContentDescRes, int closeDrawerContentDescRes) { 

     this(activity, drawerLayout, null, 
      openDrawerContentDescRes, closeDrawerContentDescRes); 
    } 

    public FlippedDrawerToggle(Activity activity, DrawerLayout drawerLayout, 
     Toolbar toolbar, int openDrawerContentDescRes, int closeDrawerContentDescRes) { 

     super(activity, drawerLayout, toolbar, 
      openDrawerContentDescRes, closeDrawerContentDescRes); 

     try { 
      Field sliderField = ActionBarDrawerToggle.class.getDeclaredField("mSlider"); 
      sliderField.setAccessible(true); 
      DrawerArrowDrawable arrow = (DrawerArrowDrawable) sliderField.get(this); 
      arrow.setDirection(DrawerArrowDrawable.ARROW_DIRECTION_RIGHT); 
     } 
     catch (NoSuchFieldException | IllegalAccessException e) { 
      // Fail silently 
     } 
    } 
} 

Dadurch wird nur die Richtung des Bilds des Kippschalters geändert. Wenn Sie eigentlich das ganze ActionBar/Toolbar umdrehen möchten, sollten Sie stattdessen die Richtung des Layouts entsprechend ändern.

+0

Vielen Dank :) – Maryam

+0

Kein Problem. Falls Sie es nicht bemerkt haben, habe ich ein paar Dinge im Code geändert, seit ich es ursprünglich gepostet habe. Ich hatte den Konstruktor vergessen, der eine 'Toolbar' verwendet, und ich verwendete eine Richtungskonstante, die nur in 19+ verfügbar ist. Ich denke, es sollte gut sein, jetzt zu gehen. Prost! –

+0

eine andere Frage: Wissen Sie, wie Sie 'layordirection' auf' RTL' für API-Level unter 17 setzen? weil im Moment Hamburger Bild ist auf der linken Seite der Actionbar – Maryam

0

Try this:

//Find the action bar for customizations 
    final ActionBar ab = getSupportActionBar(); 
    assert ab != null; 

    //Make the action bar display an up arrow and set its drawable and color 
    ab.setDisplayHomeAsUpEnabled(true); 
    final Drawable upArrow = ResourcesCompat.getDrawable(
      getResources(), 
      R.drawable.abc_ic_ab_back_mtrl_am_alpha, //this is the <- arrow from android resources. Change this to the thing you want. 
      null); 
    assert upArrow != null; 
    upArrow.setColorFilter(
      ContextCompat.getColor(
        getApplicationContext(), 
        R.color.white // change this to the color you want (or remove the setColorFilter call) 
      ), 
      PorterDuff.Mode.SRC_ATOP); 
    ab.setHomeAsUpIndicator(upArrow); 
+0

Ich sagte, es in meiner Frage, dass ich 'setHomeAsUpIndicator' getestet. aber es entfernt Animation und es ändert nur das Hamburgerbild – Maryam

0

diese Bedingung hinzufügen zwischen mDrawerToggle = new ActionBarDrawerToggle... und mDrawerToggle.syncState(); wie folgt aus:

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 


if (getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) 
{ 
     toolbar.setLayoutDirection(View.LAYOUT_DIRECTION_RTL); 
} 


mDrawerToggle.syncState();