如何在使用attr / selectableItemBackground作为背景时修改纹波颜色?

我看过一些SO问题,他们提供了一些可能的方法来实现我想要的。 例如:

  1. 在styles.xml中使用colorControlHighlight属性。

    这是我的styles-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属性。

    所以我在我的TextView添加了android:backgroundTint="#5677FC" 。 仍然无用。 然后我试图改变android:backgroundTintModesrc_insrc_atop ,他们从来没有区别。

那么,当我使用?attr/selectableItemBackground作为背景时,如何更改波纹颜色。 我只专注于棒棒糖及以上。 先谢谢你!

最后,我find了解决scheme:而不是直接在主题SelectableItemBackground中使用android:colorControlHighlight ,我应该写另一种风格:

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

最后在layout.xml中添加style="@style/SelectableItemBackground"View

在2016/8/26更新之后N发布之后,我发现有时候我们不能使用这种方法为某种View (例如CardView )设置纹波颜色。 现在我强烈build议使用RippleDrawable开发人员,也可以在xml中声明。 这里是一个例子:

当用户触摸/点击一个CardView上面的API21时,我想显示一个涟漪效应,当然在棒棒糖之前应该有另一种反馈。 所以我应该写:

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

drawable文件夹中的selectable_item_background

 <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文件夹中的selectable_item_background

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

最后, drawable (或drawable-v21 )文件夹中的ripple_black

 <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" 。 不要忘记设置一个OnClickListenerOnTouchListener或类似的东西,否则波纹不会显示。

harrane和stream亭是正确的。 接受的答案不是最好的方法。 让我在代码中显示如何更改pre-Lollipop版本和更高版本的波纹颜色

  1. 你的AppTheme应该inheritance任何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值

另外,如果您想在不同的活动中使用不同的波纹颜色,则可以在Manifest文件中为每个活动设置个人主题,例如:

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

UPD:如果在同一个活动中想要不同的波纹颜色,会怎么样?

您需要在运行时更改每个片段的活动主题的属性。 在片段被自定义样式膨胀之前,只需覆盖它们并应用到当前主题:

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

只有在设置为主题时才能使用

被接受的答案是错误的。

正确的使用方法是stream亭在评论中提到的。 使用colorControlHiglight代替android:colorControlHiglight来更改AppCompat的默认colorControlHiglight

*请参阅Theming部分的http://android-developers.blogspot.co.uk/2014/10/appcompat-v21-material-design-for-pre.html *