как я могу изменить цвет переключателя в навигационном ящике? [Дубликат]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

14
задан GPack 2 December 2014 в 20:11
поделиться

3 ответа

Это должно работать.

<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>
23
ответ дан AndroidMech 19 August 2018 в 17:36
поделиться
  • 1
    Обращайтесь с вашим ящиком, используя setNavigationOnClickListener на панели инструментов – AndroidMech 2 December 2014 в 14:48
  • 2
    Урок стилизации - это то же самое, что я пытался. Не работает. Thks. – GPack 2 December 2014 в 14:54
  • 3
    вы используете панель действий или панель инструментов. Также ActionBarToggle из поддержки v4 устарел в v21. Теперь он импортируется из appcompat v7.Если вы импортировали правильный? – AndroidMech 2 December 2014 в 14:57
  • 4
    Я использую ActionBar ActionBarActivity. – GPack 2 December 2014 в 14:59
  • 5
    код, который я опубликовал, работает на меня. Моя родительская тема - Theme.AppCompat.Light и ее работа для меня хорошо. У меня есть красный значок ящика над красной стрелкой, которая вращается в моем проекте – AndroidMech 2 December 2014 в 15:05

Существует также способ сделать это программно, воспользовавшись существующими цветовыми методами в DrawerArrowDrawable. Вам просто нужно передать свои DrawerArrowDrawable в ActionBarDrawerToggle и сохранить ссылку на DrawerArrowDrawable, чтобы вы могли вызывать его методы.

Однако этот конструктор в ActionBarDrawerToggle в настоящее время имеет пакетный доступ, поэтому вам нужно добавить класс в пакет android.support.v7.app, чтобы получить к нему доступ.

Вот подход, который простирается от ActionBarDrawerToggle, чтобы разоблачить цветовые методы.

Поместите этот класс в / src / android / support / v7 / app /:

/*
 * 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
6
ответ дан Lorne Laliberte 19 August 2018 в 17:36
поделиться

После поддержки библиотеки 24.1.0 теперь вы можете получить доступ к getDrawerArrowDrawable(). Чтобы изменить цвет, вам просто нужно сделать это:

toggle.getDrawerArrowDrawable().setColor(getColor(R.color.colorPrimary));
14
ответ дан Sanf0rd 19 August 2018 в 17:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: