Android: AppCompat 21, как изменить значок «назад» и значок переполнения на пользовательский?

В моем проекте несколько дней назад я использовал панель действий Sherlock, но я решил изменить весь стиль панели действий на новый материальный дизайн. В моей старой теме для значка «Назад» и «Переполнение» у меня было несколько пользовательских значков, установленных в моей теме. Но в appcompat я попытался определить его в своей теме, где я использую его на панели инструментов, но он не работает. Кто-нибудь знает, как сделать это возможным?

Моя тема, которую я использую на панели инструментов (создано с помощью Asset Studio):

<style name="Theme.Themewiz" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="android:actionBarStyle">@style/ActionBar.Solid.Themewiz</item>

    <item name="android:actionBarItemBackground">@drawable/selectable_background_themewiz</item>
    <item name="android:popupMenuStyle">@style/PopupMenu.Themewiz</item>
    <item name="android:dropDownListViewStyle">@style/DropDownListView.Themewiz</item>
    <item name="android:actionBarTabStyle">@style/ActionBarTabStyle.Themewiz</item>
    <item name="android:actionDropDownStyle">@style/DropDownNav.Themewiz</item>
    <item name="android:actionModeBackground">@drawable/cab_background_top_themewiz</item>
    <item name="android:actionModeSplitBackground">@drawable/cab_background_bottom_themewiz</item>
    <item name="android:actionModeCloseButtonStyle">@style/ActionButton.CloseMode.Themewiz</item>

            <!-- Light.DarkActionBar specific -->
    <item name="android:actionBarWidgetTheme">@style/Theme.Themewiz.Widget</item>

    <item name="android:actionOverflowButtonStyle">@style/Theme.AppCompat.Overflow</item>

</style>

<style parent="@style/Widget.AppCompat.ActionButton.Overflow" name="Theme.AppCompat.Overflow">

    <item name="android:src">@drawable/ic_action_overflow</item>

</style>

XML-файл панели инструментов:

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_awesome_toolbar"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="?attr/colorPrimaryDark"
    app:theme="@style/Theme.Themewiz"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

person billiout    schedule 31.10.2014    source источник
comment
Код? XML? Без него невозможно помочь.   -  person Pedro Oliveira    schedule 31.10.2014
comment
Я редактирую свой исходный пост с помощью xml из темы и xml из панели инструментов.   -  person billiout    schedule 31.10.2014


Ответы (4)


Использовать appcompat 21 для достижения этих целей довольно просто.

Чтобы изменить значок «Назад», вам придется вместо этого использовать панель инструментов поддержки в качестве панели действий. Этот пост Криса Бейнса поможет вам начать работу.

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

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_id);
toolbar.setNavigationIcon(R.drawable.back_icon);

С другой стороны, чтобы изменить значок переполнения, проще всего добавить собственный стиль к объявлению основной темы. Что-то типа:

<resources>
    <!-- Base application theme. -->
    <style name="Your.Theme" parent="@style/Theme.AppCompat">
        <!-- Your theme items go here -->

        <item name="actionOverflowButtonStyle">@style/OverFlow</item>
    </style>

    <!-- Styles -->
    <style name="OverFlow" parent="@android:style/Widget.AppCompat.ActionButton.Overflow">
        <item name="android:src">@drawable/overflow_icon</item>
    </style>

</resources>

Надеюсь, это поможет.

person Kingsley Adio    schedule 02.11.2014
comment
У меня сработало, за исключением использования @style/Widget.AppCompat.ActionButton.Overflow вместо @android:style/Widget.AppCompat.ActionButton.Overflow - person Birrel; 07.08.2015
comment
Это сработало для меня, но использует очень большую версию моего значка. У меня есть несколько значков в нескольких папках с возможностью рисования, но, похоже, он не выбирает размер, соответствующий другим моим значкам. - person Rock Lee; 08.09.2015
comment
На самом деле, я только что получил решение той проблемы, которая у меня была. Мне пришлось использовать значок 24dp. Вы можете увидеть мой вопрос SO и его ответ здесь: stackoverflow.com/questions/32450144/ - person Rock Lee; 08.09.2015

Я сделал так, и это работает для меня

<style name="AppTheme.Base" parent="Theme.AppCompat.Light">
    <item name="actionOverflowButtonStyle">@style/OverFlow</item>
</style>

<style name="OverFlow" parent="Widget.AppCompat.ActionButton.Overflow">
    <item name="android:src">@drawable/custom_button</item>
</style>
person n1m1    schedule 18.02.2015

Получить сами представления немного сложно, но настроить их значки и/или цвет можно с помощью функций панели инструментов. Пример:

toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
final Drawable navigationIcon = toolbar.getNavigationIcon();
toolbar.setNavigationIcon(getTintedDrawable(this, navigationIcon, 0xffff0000));
final Drawable overflowIcon = toolbar.getOverflowIcon();
toolbar.setOverflowIcon(getTintedDrawable(this, overflowIcon, 0xffff0000));

public static Drawable getTintedDrawable(@NonNull Context context, @NonNull Drawable inputDrawable, @ColorInt int color) {
    Drawable wrapDrawable = DrawableCompat.wrap(inputDrawable);
    DrawableCompat.setTint(wrapDrawable, color);
    DrawableCompat.setTintMode(wrapDrawable, Mode.SRC_IN);
    return wrapDrawable;
}
person android developer    schedule 27.03.2016

Для изменения стрелки навигации проверьте код ниже

final Drawable upArrow = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
upArrow.setColorFilter(Color.parseColor("#FFFFFF"), PorterDuff.Mode.SRC_ATOP);
getSupportActionBar().setHomeAsUpIndicator(upArrow);

Сначала нам нужно добавить атрибут описания содержимого к значку меню переполнения в файле styles.xml. Это может быть любая строка, просто нужно найти нужное представление позже в коде по ее описанию.

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.MyTheme">
    <!-- Customize your theme here. -->
    <item name="android:actionOverflowButtonStyle">@style/Widget.ActionButton.Overflow</item>
</style>

<style name="Widget.ActionButton.Overflow" parent="@android:style/Widget.Holo.ActionButton.Overflow">
    <item name="android:contentDescription">@string/accessibility_overflow</item>
</style>

Во-вторых, мы реализуем метод, отвечающий за поиск и раскрашивание значка переполнения:

  /* It's important to set overflowDescription atribute in styles, so we cangrab the reference
* to the overflow icon. Check: res/values/styles.xml
* @param activity
* @param colorFilter
*/
private static void setOverflowButtonColor(final Activity activity, final PorterDuffColorFilter colorFilter) {
    final String overflowDescription = activity.getString(R.string.abc_action_menu_overflow_description);
    final ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
    final ViewTreeObserver viewTreeObserver = decorView.getViewTreeObserver();
    viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            final ArrayList<View> outViews = new ArrayList<View>();
            decorView.findViewsWithText(outViews, overflowDescription,
                    View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
            if (outViews.isEmpty()) {
                return;
            }
            TintImageView overflow=(TintImageView) outViews.get(0);
            overflow.setColorFilter(colorFilter);
            removeOnGlobalLayoutListener(decorView,this);
        }
    });
}

/***Use below code in your activity screen for apply color*/

 final PorterDuffColorFilter colorFilter= new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.MULTIPLY);
setOverflowButtonColor(this,colorFilter);

Пожалуйста, проверьте ссылку ниже, чтобы узнать больше https://snow.dog/blog/how-to-dynamicaly-change-android-toolbar-icons-color/

person Piyush    schedule 26.11.2015
comment
Пожалуйста, проверьте мое новое обновление, дайте мне знать, если возникнут вопросы - person Piyush; 26.11.2015
comment
Можно ли получить кнопку переполнения во время выполнения без установки стиля? - person android developer; 24.03.2016