AppCompatButton backgroundTint API < 21

Posted

技术标签:

【中文标题】AppCompatButton backgroundTint API < 21【英文标题】: 【发布时间】:2015-07-05 14:32:23 【问题描述】:

我想在按钮上使用波纹效果。 AppCompat v22.1 为 AppCompat 着色添加了 AppCompatButton 和新功能。

我的布局:

<android.support.v7.widget.AppCompatButton
        android:id="@+id/add_remove_button"
        android:layout_
        android:layout_
        android:backgroundTint="@color/primary"
        android:textColor="@android:color/white"
        android:text="Remove" />

在我的 API 22 测试设备上,涟漪效果完美运行,但我正在为 API 11 编码,不幸的是 backgroundTint 需要 API >= 21。如何在旧 API 版本上将涟漪效果设置为按钮?

【问题讨论】:

可能是***.com/questions/26444391/…你可以在这里回答。 涟漪在棒棒糖之前无法开箱即用,因此您必须模仿它们。 Ripple 仅适用于 api>=21 但根据android-developers.blogspot.hu/2015/04/…:“此时色彩感知小部件的完整列表是:[...] AppCompatButton [...]” 通过将主题应用于具有colorButtonNormal 属性的按钮(我尝试了 4.4.4 和 5.1),为按钮着色对我有用。 【参考方案1】:

只需使用app:backgroundTint 而不是android:backgroundTint,色调将在棒棒糖下方生效。原因是AppCompatActivityAppCompatDelegateImplV7使用AppCompatViewInflater将Button或TextView自动更改为AppCompatButton或AppCompatTextView,然后app:backgroundTint生效。

【讨论】:

而“app”是这样定义的:xmlns:app="schemas.android.com/apk/res-auto" 我有一个线性布局,我正在使用 android:background="@drawable/background_sign_up" app:backgroundTint="#dd282d50" android:backgroundTintMode="multiply",该怎么办。跨度> 有效,但它说:“在 app:backgroundTint 行中为标签按钮找到了意外的命名空间前缀“app” 对于遇到错误 Unexpected namespace prefix “app” found for... 的人,您可能需要将 Button 更改为 android.support.v7.widget.AppCompatButton AppCompatActivity 自动将 Buttons 更改为 AppCompatButton,因此您可以忽略警告【参考方案2】:

Ripples 不能作为 Android http://android-developers.blogspot.de/2014/10/appcompat-v21-material-design-for-pre.html

为什么在棒棒糖之前没有涟漪? 很多让 RippleDrawable 顺利运行的原因是 Android 5.0 的新 RenderThread。为了优化旧版 Android 的性能,我们暂时不使用 RippleDrawable。

【讨论】:

【参考方案3】:

要支持 API 21 以下的波纹功能,您可能需要在按钮的背景中添加一个可绘制对象:

<android.support.v7.widget.AppCompatButton
    android:id="@+id/add_remove_button"
    android:layout_
    android:layout_
    android:background="@drawable/button_ripple"
    android:backgroundTint="@color/primary"
    android:textColor="@android:color/white"
    android:text="Remove" />

然后您必须在 drawable 和 drawable-v21 目录中添加具有相同名称的 xml(如果您没有它们,您可以创建它们,它们将自动链接)。

/res/drawable-v21/button_ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/white">
    <item>
        <shape>
            <solid android:color="@color/white" />
        </shape>
    </item>
</ripple>

/res/drawable/button_ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <solid android:color="@color/white" />
        </shape>
    </item>
</selector>

【讨论】:

【参考方案4】:

我正在分享我的用例:它是与 ImageView 一起使用的:

app:backgroundTint 没有生效,因为我使用 android:src 标签作为该 Imageview 中的背景图像。

当我为 Imageview 将其更改为 android:background 时,app:backgroundTint 工作得很好。

人们应该使用的不同答案提到的第二个用例

androidx.appcompat.widget.AppCompatImageView

而不是ImageView

【讨论】:

以上是关于AppCompatButton backgroundTint API < 21的主要内容,如果未能解决你的问题,请参考以下文章

AppCompatButton backgroundTint API < 21

在 v21 中设置 AppCompatButton 的样式,使其没有阴影且圆角半径为零

markdown AppCompatButton具有Ripple效果和Touch on Touch

IllegalStateException:在父或祖先上下文类 android.support.v7.widget.AppCompatButton 中找不到方法 insert(View)

z-index使用及一定要加backgroun

移动端设置, mobile , 一张图片作为背景 ,平铺 ,自动拉伸 , 图片 铺满视界 ,窗口. background-image , background-size, backgroun