2014-12-02 83 views
14

如何在ActionBar中使用AppCompat-v7(v21)更改动画ActionBarDrawerToggle图标的颜色? 我试过了,但不起作用。谢谢。ActionBar中的动画ActionBarDrawerToggle的颜色

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) 

值/ styles.xml

<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> 

UPDATE:解决,有这个条目<item name="actionBarWidgetTheme">在我的主题可能重叠<item name="drawerArrowStyle">。我删除它,现在所有的作品。

回答

22

这应该工作..

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

,并在父主题..

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

通过使用工具栏上的 – AndroidMech 2014-12-02 13:48:53

+1

造型片段的setNavigationOnClickListener处理你的抽屉,我试图相同。不起作用。 THKS。 – GPack 2014-12-02 13:54:22

+0

您是否使用操作栏或工具栏从v4支持v4中的ActionBarToggle也被弃用。现在从appcompat v7导入。是否已导入正确的? – AndroidMech 2014-12-02 13:57:36

6

有一个办法做到这一点编程中,通过采取现有颜色的方法的优点DrawerArrowDrawable。您只需将您自己的DrawerArrowDrawable传递给ActionBarDrawerToggle并保留对DrawerArrowDrawable的引用,以便您可以调用其方法。

然而,内ActionBarDrawerToggle该构造目前有包私有访问,所以你需要在android.support.v7.app包添加一个类来访问它。

下面是一个从ActionBarDrawerToggle开始展示颜色方法的方法。

将这个类转换/ src目录/安卓/支持/ V7 /应用/:

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

就用ColorableActionBarDrawerToggle代替ActionBarDrawerToggle,并调用其setColor()setColorFilter()方法在运行时改变颜色:

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

看起来支持库24.1.0中会添加方法,以便在没有任何解决方法的情况下实现此目的:https://code.google.com/p/android/issues/detail?id=203429 – 2016-06-23 20:01:18

14

由于支持库24.1.0,您现在可以访问getDrawerArrowDrawable()。因此,要改变颜色,你只需要做到这一点:

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