Как стилизовать панель инструментов MenuItems при нажатии

В KitKat у меня есть стилизованное меню опций на панели инструментов поддерживаемой библиотеки, определенное следующим образом

    <android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:background="?attr/colorPrimary"
    app:theme="@style/ToolbarText"
    app:popupTheme="@style/optionMenu" 
    />

где стиль optionMenu

<style name="optionMenu">
    <item name="android:textColor">@color/menu_text</item>  
    <item name="android:background">@color/menu_background</item>

</style>

Он работает так, как ожидалось, но когда я нажимаю MenuItems, он принимает не «серый по умолчанию» цвет во всем доступном пространстве, а только по краям вокруг элемента меню, фон которого остается цветным, как определено в стиле. Моя цель - не менять стиль при нажатии на событие, я хочу только, чтобы фон за текстом при нажатии выглядел как вся прямоугольная кнопка

Где я не прав?


person marco    schedule 18.11.2014    source источник


Ответы (2)


Наконец, посмотрев более суток в библиотеке по умолчанию, я заставил ее работать в моем приложении со следующими настройками:

Файл макета

<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/ToolBarStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/toolbar_color"
    android:minHeight="@dimen/abc_action_bar_default_height_material" />

Стили

 <style name="ToolBarStyle" parent="">
    <item name="android:elevation">@dimen/toolbar_elevation</item>
    <item name="popupTheme">@style/ItemMenuBackground</item>
    <item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
</style>

<style name="ItemMenuBackground" parent="ThemeOverlay.AppCompat.Light">
    <item name="android:colorBackground">@android:color/white</item>
    <item name="listChoiceBackgroundIndicator">@android:color/white</item>
</style>

Под @dimen/toolbar_elevation я только что упомянул "4dp", но здесь это не вызывает беспокойства. С помощью <item name="android:colorBackground"> я смог установить нормальный фон, а с помощью <item name="listChoiceBackgroundIndicator"> я смог установить фон при нажатии элементов меню.

Я надеюсь это поможет

person Tejas Sherdiwala    schedule 24.06.2015
comment
Возможно, вы знаете, как это сделать для обычных пунктов меню действий? В настоящее время при использовании стиля ThemeOverlay.AppCompat.Dark.ActionBar он устанавливает для селектора фона белая рябь на Lollipop и выше. - person android developer; 10.12.2015
comment
@androiddeveloper, я не уверен, поскольку вопрос был задан не для материального дизайна. Но я думаю, что этот трюк может сделать ресурс с возможностью рисования. В основном вам нужно заменить ресурс цвета на ресурс с возможностью рисования для эффекта пульсации. Также не забудьте включить drawable для устройств pre-lollypop. Ссылка stackoverflow.com/a/26686433/1161911 может быть полезной. - person Tejas Sherdiwala; 12.12.2015
comment
Отлично. Может быть полезно. Вы пробовали? Но как мне установить его на панель инструментов? - person android developer; 12.12.2015
comment
@androiddeveloper Да, я пробовал это в своем проекте, и он работал как шарм. Я уже добавил ToolBarStyle в элемент Toolbar с помощью атрибута style. - person Tejas Sherdiwala; 23.01.2016

Добавьте свои собственные кнопки меню и стилизуйте их соответствующим образом, ниже приведен пример того, как это сделать:

<android.support.v7.widget.Toolbar
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/toolbar"
   android:minHeight="?attr/actionBarSize"
   android:layout_height="?attr/actionBarSize"
   android:layout_width="match_parent">

   <!-- this adds a button at the center of the toolbar -->
   <ImageButton
       android:id="@+id/button"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:onClick="buttonHandler"
       android:src="@drawable/ic_launcher"
       android:background="@drawable/backgroundStates"
       android:layout_gravity="center"/>

</android.support.v7.widget.Toolbar>

Теперь в свой ресурс с возможностью рисования добавьте файл с именем backgroundStates.xml со следующим содержимым:

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_pressed="true" android:drawable="@android:color/holo_blue_light"/>
     <item  android:drawable="@android:color/darker_gray" />
 </selector>

Вышеупомянутый изменит цвет с серого на holo_blue_light всякий раз, когда кто-то нажимает на вашу определенную кнопку на панели инструментов.

Теперь создайте в своей деятельности функцию для обработки onClicks по определенной кнопке:

 public void buttonHandler(View v){

  // Do stuf you want that should happen on button pressed, you may want to inflate a list view or other stuff ...
  }
person Abhinav Puri    schedule 19.12.2014