Как изменить цвет пульсации при использовании? Attr / selectableItemBackground в качестве фона?

Я видел несколько вопросов, и они дали некоторые возможные методы для достижения того, чего я хочу. Например:

  1. Используйте атрибут colorControlHighlight в styles.xml.

    Вот мои стили-v21.xml:

     <style name="SelectableItemBackground"> <item name="android:colorControlHighlight">#5677FC</item> <item name="android:background">?attr/selectableItemBackground</item> </style> 

    И мой виджет:

     <TextView android:id="@+id/tv_take_photo_as_bt" android:layout_width="280dp" android:layout_height="48dp" android:text="@string/act_take_photo" style="@style/SelectableItemBackground"/> 

    И это не сработает. Я также попытался добавить parent="Theme.AppCompat в стиль" SelectableItemBackground "или изменить colorControlHighlight(no android: prefix)" или изменить на ?android:attr/selectableItemBackground , и это не полезно.

  2. Использовать атрибут backgroundTint в макете.

    Поэтому я добавляю android:backgroundTint="#5677FC" в свой TextView . Все еще бесполезно. Затем я попытался изменить android:backgroundTintMode на src_in и src_atop , и они никогда не имеют src_atop значения.

Итак, как я могу изменить цвет пульсации, когда я использую ?attr/selectableItemBackground качестве фона. Я сосредотачиваюсь только на Lollipop и выше. Заранее спасибо!

Solutions Collecting From Web of "Как изменить цвет пульсации при использовании? Attr / selectableItemBackground в качестве фона?"

Наконец, я нахожу решение: вместо использования android:colorControlHighlight непосредственно в теме SelectableItemBackground , я должен написать другой стиль:

 <style name="SelectableItemTheme"> <item name="colorControlHighlight">@color/ripple_color</item> </style> 

Затем:

 <style name="SelectableItemBackground"> <item name="android:theme">@style/SelectableItemTheme</item> <item name="android:background">?attr/selectableItemBackground</item> </style> 

Наконец добавьте style="@style/SelectableItemBackground" в View в layout.xml.

ОБНОВЛЕНО НА 2016/8/26 После выхода N я обнаружил, что иногда мы не можем использовать этот метод для установки цвета пульсации для какого-то View (например, CardView ). Теперь я настоятельно рекомендую разработчиков, использующих RippleDrawable , которые также можно объявить в xml. Вот пример:

Я хочу показать эффект пульсации, когда пользователь прикасается / щелкает CardView выше API21, и, конечно же, перед Lollipop должен быть другой вид обратной связи. Поэтому я должен написать:

 <android.support.v7.widget.CardView android:layout_width="wrap_content" android:layout_height="wrap_content" android:foreground="@drawable/selectable_item_background"/> 

И selectable_item_background в папке с возможностью drawable :

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="false" android:drawable="@android:color/transparent" /> <item android:drawable="@color/color_clicked" /> </selector> 

drawable-v21 папке drawable-v21 :

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/ripple_black" /> </selector> 

Наконец, ripple_black в ripple_black (или drawable-v21 ):

 <ripple xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:color="@color/color_clicked" tools:ignore="NewApi" /> <!--you can remove this line if it's in v21 folder--> 

Вот и все. Для других видов, возможно, вам следует использовать android:background="@drawable/selectable_item_background" . Не забудьте установить OnClickListener , OnTouchListener или что-то вроде этого для них, иначе рябь не OnTouchListener .

Харран и Лиутинг правы. Принятый ответ – не лучший способ. Позвольте мне показать в коде, как изменить цвет пульсации для версий до Lollipop и выше

  1. Ваш AppTheme должен наследовать от любой темы AppCompat и содержать атрибут colorControlHighlight (без префикса 'android:')

     <!-- Application theme. --> <style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar"> <item name="colorControlHighlight">#40ffffff</item> </style> 
  2. Ваше представление должно содержать clickable = «true», а фон должен быть «? Attr / selectableItemBackgroundBorderless» или «? Attr / selectableItemBackground»:

     <LinearLayout ... android:clickable="true" android:background="?attr/selectableItemBackgroundBorderless"/> 

Обратите внимание: если ваш родительский вид имеет белый фон, вы не увидите эффекта пульсации, так как он белый. Изменить значение colorControlHighlight для другого цвета

Кроме того, если вам нужны разные цвета пульсации в разных действиях, вы можете установить персональную тему для каждого вида деятельности в файле манифеста, например:

  <activity android:name="com.myapp.GalleryActivity" android:theme="@style/RedRippleTheme" /> 

UPD: Что делать, если вам нужны разные цвета пульсации для разных фрагментов в одной и той же активности?

Для каждого фрагмента во время выполнения вам необходимо изменить атрибуты темы Activity. Просто перезапишите их, прежде чем фрагмент будет завышен с вашим пользовательским стилем и применим к текущей теме:

В значениях / styles.xml

  <style name="colorControlHighlight_blue"> <item name="colorControlHighlight">@color/main_blue_alpha26</item> </style> 

Затем, в вашем фрагменте перед инфляцией в onCreateView() :

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { getContext().getTheme().applyStyle(R.style.colorControlHighlight_blue, true); //blue ripple color View view = inflater.inflate(R.layout.my_fragment_layout, container, false); return view; } 

Этот стиль будет работать только для этого фрагмента

UPD 2: Пожалуйста, поправьте меня, если я ошибаюсь, но кажется, что атрибут colorControlHighlight не работает в макетах, если вы примените их к представлению:

  <TextView ... colorControlHighlight="#40ffffff"/> <!-- DOESN'T WORK --> 

И работает только тогда, когда для него задана тема

Принятый ответ неверен.

Правильный способ использования – это то, что упоминалось в комментарии. Используйте colorControlHiglight вместо android:colorControlHiglight для изменения android:colorControlHiglight по умолчанию из AppCompat

* Пожалуйста, обратитесь к http://android-developers.blogspot.co.uk/2014/10/appcompat-v21-material-design-for-pre.html в разделе Theming *