2014-12-02 24 views
14

AppCompat-v7 (v21) kullanarak ActionBar'daki hareketli ActionBarDrawerToggle simgelerinin rengini nasıl değiştirebilirim? Bunu denedim, ama çalışmıyor. Teşekkürler. GÜNCELLEMEHareketli renkBuDrawerToggle in ActionBar

<item name="drawerArrowStyle">@style/DrawerArrowStyle</item> 

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

myActionBarActivity.java

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mLeftDrawer = (LinearLayout) findViewById(R.id.left_drawer); 

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
      R.string.drawer_open, R.string.drawer_close) 

değerler/styles.xml

: çözüldü, bu girişinvardı, muhtemelen <item name="drawerArrowStyle"> ile örtüşen temamda. Onu kaldırdım ve şimdi tüm işler.

cevap

22

Bu çalışması gerekir .. varolan renk yöntemlerinin yararlanarak, hem de programlı bunu yapmanın bir yolu yoktur

<style name="AppTheme" parent="AppBaseTheme"> 
<item name="drawerArrowStyle">@style/DrawerArrowStyle</item> 
     . 
     . 
     . 
</style> 
+0

araç çubuğu – AndroidMech

+1

Şekillendirme pasajları setNavigationOnClickListener kullanarak çekmece Kulp i çalıştı aynıdır. Çalışmıyor. Thks. – GPack

+0

eylem çubuğunu veya araç çubuğunu kullanıyor musunuzAlso ActionBarToggle destek v4 v21'de artık kullanılmamaktadır.It şimdi appcompat v7'den alınır. – AndroidMech

6

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

ve ana tema

.. DrawerArrowDrawable. Sadece kendi DrawerArrowDrawable'unuzu ActionBarDrawerToggle'a aktarmanız ve DrawerArrowDrawable referansına başvurmanız gerekir, böylece yöntemlerini çağırabilirsiniz. Ancak, ActionBarDrawerToggle içinde bulunan bu kurucunun şu anda paket özel erişimi vardır, bu nedenle ona erişmek için android.support.v7.app paketine bir sınıf eklemeniz gerekir.

Renk yöntemlerini göstermek için ActionBarDrawerToggle'dan başlayan bir yaklaşım.

/* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

package android.support.v7.app; 

import android.app.ActionBar; 
import android.app.Activity; 
import android.content.Context; 
import android.graphics.ColorFilter; 
import android.graphics.drawable.Drawable; 
import android.os.Build; 
import android.support.annotation.ColorInt; 
import android.support.annotation.StringRes; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.graphics.drawable.DrawerArrowDrawable; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 

/* 
* Version of ActionBarDrawerToggle that exposes DrawerArrowDrawable's color methods. 
* Needs to be in android.support.v7.app in order to access a constructor in ActionBarDrawerToggle 
* which currently has package-private access. 
*/ 
public class ColorableActionBarDrawerToggle extends ActionBarDrawerToggle { 

    private final DrawerArrowDrawable mSlider; 

    /** 
    * Construct a new ColorableActionBarDrawerToggle. 
    * 
    * <p>The given {@link Activity} will be linked to the specified {@link DrawerLayout} and 
    * its Actionbar's Up button will be set to a custom drawable. 
    * <p>This drawable shows a Hamburger icon when drawer is closed and an arrow when drawer 
    * is open. It animates between these two states as the drawer opens.</p> 
    * 
    * <p>String resources must be provided to describe the open/close drawer actions for 
    * accessibility services.</p> 
    * 
    * @param activity     The Activity hosting the drawer. Should have an ActionBar. 
    * @param drawerLayout    The DrawerLayout to link to the given Activity's ActionBar 
    * @param openDrawerContentDescRes A String resource to describe the "open drawer" action 
    *         for accessibility 
    * @param closeDrawerContentDescRes A String resource to describe the "close drawer" action 
    *         for accessibility 
    */ 
    public ColorableActionBarDrawerToggle(Activity activity 
             , DrawerLayout drawerLayout 
             , @StringRes int openDrawerContentDescRes 
             , @StringRes int closeDrawerContentDescRes) { 
     this(activity, null, drawerLayout, null, openDrawerContentDescRes, closeDrawerContentDescRes); 
    } 

    /** 
    * Construct a new ColorableActionBarDrawerToggle with a Toolbar. 
    * <p> 
    * The given {@link Activity} will be linked to the specified {@link DrawerLayout} and 
    * the Toolbar's navigation icon will be set to a custom drawable. Using this constructor 
    * will set Toolbar's navigation click listener to toggle the drawer when it is clicked. 
    * <p> 
    * This drawable shows a Hamburger icon when drawer is closed and an arrow when drawer 
    * is open. It animates between these two states as the drawer opens. 
    * <p> 
    * String resources must be provided to describe the open/close drawer actions for 
    * accessibility services. 
    * <p> 
    * Please use {@link #ActionBarDrawerToggle(Activity, DrawerLayout, int, int)} if you are 
    * setting the Toolbar as the ActionBar of your activity. 
    * 
    * @param activity     The Activity hosting the drawer. 
    * @param toolbar     The toolbar to use if you have an independent Toolbar. 
    * @param drawerLayout    The DrawerLayout to link to the given Activity's ActionBar 
    * @param openDrawerContentDescRes A String resource to describe the "open drawer" action 
    *         for accessibility 
    * @param closeDrawerContentDescRes A String resource to describe the "close drawer" action 
    *         for accessibility 
    */ 
    public ColorableActionBarDrawerToggle(Activity activity 
             , DrawerLayout drawerLayout 
             , Toolbar toolbar 
             , @StringRes int openDrawerContentDescRes 
             , @StringRes int closeDrawerContentDescRes) { 
     this(activity, toolbar, drawerLayout, null, openDrawerContentDescRes, closeDrawerContentDescRes); 
    } 

    /** 
    * In the future, [Google] can make this constructor public if [they] want to let developers customize 
    * the animation. 
    * 
    * [If they make this constructor public, ColorableActionBarDrawerToggle could be in another package.] 
    */ 
    <T extends DrawerArrowDrawable & DrawerToggle> 
    ColorableActionBarDrawerToggle(Activity activity 
            , Toolbar toolbar 
            , DrawerLayout drawerLayout 
            , T slider 
            , @StringRes int openDrawerContentDescRes 
            , @StringRes int closeDrawerContentDescRes) { 
     super(activity 
      , toolbar 
      , drawerLayout 
      , (slider == null) ? slider = (T)new DrawerArrowDrawableToggle(activity, getActionBarThemedContext(activity, toolbar)) 
           : slider 
      , openDrawerContentDescRes 
      , closeDrawerContentDescRes); 

     mSlider = slider; 
    } 

    /* 
    * Condensed (equivalent) version of the code in all the getActionBarThemedContext methods 
    * called by ActionBarDrawerToggle constructor as of 23.1. 
    */ 
    private static Context getActionBarThemedContext(Activity activity, Toolbar toolbar) { 
     Context context = null; 
     if (toolbar != null) { 
      context = toolbar.getContext(); 
     } else if (activity instanceof DelegateProvider) { // Allow the Activity to provide an impl 
      final Delegate delegate = ((DelegateProvider) activity).getDrawerToggleDelegate(); 
      context = delegate.getActionBarThemedContext(); 
     } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      final ActionBar actionBar = activity.getActionBar(); 
      if (actionBar != null) { 
       context = actionBar.getThemedContext(); 
      } else { 
       context = activity; 
      } 
     } 
     return context; 
    } 

    /// Expose DrawerArrowDrawable's color methods 

    public void setColorFilter(ColorFilter colorFilter) { 
     if(mSlider != null) { 
      mSlider.setColorFilter(colorFilter); 
     } 
    } 

    public void setColor(@ColorInt int color) { 
     if(mSlider != null) { 
      mSlider.setColor(color); 
     } 
    } 

    @ColorInt 
    public int getColor() { 
     if(mSlider != null) { 
      return mSlider.getColor(); 
     } 
     return 0;//Color.TRANSPARENT; 
    } 

    public void setAlpha(int alpha) { 
     if(mSlider != null) { 
      mSlider.setAlpha(alpha); 
     } 
    } 
} 

Sonra sadece yerine ActionBarDrawerToggle ait ColorableActionBarDrawerToggle kullanın ve çalışma zamanında rengini değiştirmek için kendi setColor() veya setColorFilter() yöntemleri çağırmak:/src/android/destek içine bu sınıf/v7/app/

yeri:

ColorableActionBarDrawerToggle mDrawerToggle; 
// .... 
mDrawerToggle.setColor(0xffff0000); // make it red 
+1

Herhangi bir geçici çözüm olmadan bunu mümkün kılmak için 24.1.0 destek kitaplığında yöntemler eklenecektir: https://code.google.com/p/android/issues/detail?id=203429 –

14

destek kütüphanesinde 24.1.0 yana artık getDrawerArrowDrawable() erişebilir. Yani rengini değiştirmek için sadece bu yapmanız gerekir:

toggle.getDrawerArrowDrawable().setColor(getColor(R.color.colorPrimary));