如何将自定义按钮应用于 Android Studio 中的活动?

Posted

技术标签:

【中文标题】如何将自定义按钮应用于 Android Studio 中的活动?【英文标题】:How to apply custom button to the activity in Android Studio? 【发布时间】:2021-06-11 01:31:37 【问题描述】:

我的 MainActivity 有 4 个按钮,用作导航。界面如下

而且,我还在drawable文件夹下创建了button.xml。

<!-- res/drawable/button.xml -->
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <solid android:color="#457B9D"/>
    <corners android:radius="20dp"/>
    <stroke android:color="#fff" android:/>
</shape>

在 activity_main.xml 中,我想使用 android:background="@drawable/button" 将自定义按钮应用到视图

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:background="#A8DADC"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_
        android:layout_
        android:gravity="center"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <Button
            android:id="@+id/button1"
            android:layout_
            android:layout_
            android:layout_marginBottom="50dp"
            android:background="@drawable/button"
            android:text="@string/enter_current_job"
            android:textAllCaps="false"
            android:textSize="20sp" />

        <Button
            android:id="@+id/button2"
            android:layout_
            android:layout_
            android:layout_marginBottom="50dp"
            android:background="@drawable/button"
            android:text="@string/enter_job_offer"
            android:textAllCaps="false"
            android:textSize="20sp" />

        <Button
            android:id="@+id/button3"
            android:layout_
            android:layout_
            android:layout_marginBottom="50dp"
            android:background="@drawable/button"
            android:text="@string/adjust_comparison_settings"
            android:textAllCaps="false"
            android:textSize="20sp" />

        <Button
            android:id="@+id/button4"
            android:layout_
            android:layout_
            android:background="@drawable/button"
            android:text="@string/compare_job_offers"
            android:textAllCaps="false"
            android:textSize="20sp" />
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

另外,我将 theme.xml 更改为 NoActionBar

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.JobCompare6300" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
        <item name="colorOnPrimary">@color/white</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_700</item>
        <item name="colorOnSecondary">@color/black</item>
        <!-- Status bar color. -->
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->
    </style>
</resources>

但我仍然有默认按钮。我错过了什么还是做错了什么?

【问题讨论】:

你在设备上试过了吗.. 我没有安卓手机。 在 android studio 的 android 模拟器上试一试 .. 你的按钮在实际的 android 手机上看起来很正常.... 或在设计窗口中,您可以看到设置为分配或默认主题的主题选项将其更改为appcompat 以特别查看按钮的外观 【参考方案1】:

您无需使用自定义背景。 只需使用MaterialButton提供的属性即可:

    <Button
        app:backgroundTint="#457B9D"
        app:cornerRadius="20dp"
        app:strokeColor="#FFFFFF"
        app:strokeWidth="2dp"
        ../>

由于您使用的是 Material Components 主题,因此您的 Button 在运行时将替换为 MaterialButton

【讨论】:

【参考方案2】:

当您使用 MaterialComponents 主题时,您的 Button 是一个 MaterialButton,它管理自己的背景可绘制对象,因此不建议使用 android:background

要实现您想要的样式,您可以使用这些自定义属性:app:backgroundTintapp:cornerRadiusapp:strokeWidthapp:strokeColor

 <Button
   android:id="@+id/button2"
   android:layout_
   android:layout_
   android:layout_marginBottom="50dp"
   app:backgroundTint="#457B9D"
   app:cornerRadius="20dp"
   app:strokeColor="#fff"
   android:text="qzeazeazeza"
   android:textAllCaps="false"
   android:textSize="20sp"
   app:layout_constraintStart_toStartOf="parent"
   app:layout_constraintEnd_toEndOf="parent"
   app:layout_constraintTop_toTopOf="parent" />

或者,如果您需要特定的可绘制对象,您可以随时使用 android.widget.Button 或使用 AppCompat 作为主题,而不是 MaterialComponents

 <android.widget.Button
   android:id="@+id/button2"
   android:layout_
   android:layout_
   android:layout_marginBottom="50dp"
   android:background="@drawable/button"
   android:text="@string/enter_job_offer"
   android:textAllCaps="false"
   android:textSize="20sp" />

【讨论】:

以上是关于如何将自定义按钮应用于 Android Studio 中的活动?的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义 css 应用于 ionic 4 组件?

Android Gradle 插件将自定义 Gradle 插件上传到自建 Maven 仓库 ⑤ ( 使用 Sonatype Nexus 搭建 Maven 仓库 )

android以编程方式将自定义按钮添加到布局

如何将自定义字体应用于 TTTAttributedLabel

如何将自定义输入法的偏好添加到 Android 设置应用程序?

如何将自定义函数应用于每行的熊猫数据框[重复]