Android为按钮添加边框而不丢失 Material 主题(使用drawable)

标签 android android-layout material-design android-button

我有一个简单的按钮

<Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/add"
        android:backgroundTint="@color/add_bg"
        android:textColor="@color/add_fg"
        <!--android:borderColor?="@color/button_border"-->
        android:text="@string/add"/>

我想要白色背景、蓝色文本和蓝色边框。我知道我可以通过可绘制对象来实现这一点,如图所示 here以及许多其他地方。但是我观察到,如果您向按钮添加可绘制对象,那么它将丢失所有 Material 属性(例如阴影以及单击时具有精美的波纹动画)。那么如何在按钮周围添加边框而不丢失 Material 主题动画(单击时的阴影和点滴动画)?

最佳答案

Android 附带的大多数项目只是一组预先打包的属性。

期望 Android API 开发人员为每种可能的颜色/边框组合包含一组预先打包的属性几乎是不可能的,但总有一个解决方案!

不幸的是,正如您所提到的,解决方案确实在于创建您自己的自定义 XML 文件,这通常会令人生畏,直到您掌握它的窍门。一旦您这样做了,您也会惊叹于它所提供的灵活性。

根据您的情况,有两种选择...

1) 创建自定义 XML 边框绘制。

2)在按钮背景属性下设置新的自定义边框可绘制

3)然后在按钮 xml 属性下设置波纹效果,添加:

    android:foreground="?attr/selectableItemBackground"
    android:clickable="true"
    android:focusable="true"

----或----

一种更复杂的方法是制作如下所示的可绘制对象。这将添加“波纹”按钮效果以及自定义阴影、按钮颜色和边框颜色!

“对于稍后阅读本文的任何可能经验不足的人来说)

1)在项目 View 中转到 res/drawable

2)右键单击文件夹本身并选择新建/可绘制资源文件

3)输入文件名 my_ripple_button.xml(根并不重要,因为您将用下面的代码替换它)

4)如果您尚未到达,请单击文本选项卡

5)选择所有文本并基本上替换为以下内容:(创建自定义颜色边框的步骤基本相同)

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/colorPrimaryDark">
    <item android:id="@android:id/ripple">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorPrimaryDark" />
            <corners android:radius="@dimen/button_radius_large" />
       </shape>
   </item>

    <item android:id="@android:id/background">
       <shape android:shape="rectangle">
            <gradient
                android:angle="90"
                android:endColor="@color/colorPrimaryLight"
               android:startColor="@color/colorPrimary"
                android:type="linear" />
           <corners android:radius="@dimen/button_radius_large" />
        </shape>
    </item>
</ripple>

关于Android为按钮添加边框而不丢失 Material 主题(使用drawable),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52043489/

相关文章:

android - 水平回收器 View 不显示任何内容

java - RFC822 电子邮件 - Formatter - Android/iOS - 创建没有 session 或主机的 MimeMessage

java - Android Action Overflow 按钮的自定义可绘制对象

java - 在类中使用 findViewById 时出现问题

android - 样式不适用于 Spinner?

android - 从图库中选取的图像未在 ImageView 中设置

android - Handler.postdelayed()在滚动状态更改时无法在recyclerview内部工作

android - 在折叠工具栏布局上将 RecyclerView 锚定得更高

android - 工具栏重叠在状态栏下方

Android:在错误状态下更改 TextInputLayout 中 float 标签的颜色(提示)