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

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

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

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

Использование 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> 

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

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

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

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

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

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

 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/

Intereting Posts
PhoneGap – приложение phonegap phonegap дает ошибку компиляции в Linux IllegalArgumentException: Не удалось найти корень конфигурации, содержащий xxx на FileProvider.getUriForFile Как добавить API Apache HTTP (legacy) в качестве времени компиляции для build.grade для Android M? Глубокая ссылка Установка приложения Android Market на эмуляторе Идентификатор приложения для приложения Android? Как заставить OnClickListener работать с настраиваемым представлением с RelativeLayout? Подпрыгивающий мяч Android Qt5.1-android: версия Qt для mips, отсутствующих в QtCreator Бесконечная прокрутка галереи с заданной позицией изображения Как я могу сделать свой макет прокруткой как по горизонтали, так и по вертикали? Как получить Uri из MediaStore через путь к файлу? CKEditor 4.4.7 не отображается в мобильных браузерах Разъяснение по облачным сообщениям Firebase «одновременные соединения»? Как открыть любое приложение из моего браузера (Chrome) в Android? Что мне нужно сделать с ссылкой A Href?