【问题标题】:Android - cannot set button border as expectedAndroid - 无法按预期设置按钮边框
【发布时间】:2021-03-26 07:08:19
【问题描述】:

我几天前刚开始学习 Android。今天在玩 Button 时,发现无法按预期设置边框。

xml 文件如下:
按钮部分activity_main.xml:

<Button
    android:layout_width="200sp"
    android:layout_height="100dp"
    android:background="@drawable/start_button_selector"
    app:backgroundTint="@color/start_button_color_selector"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias=".4" />

start_button_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/arrow_button">
        <shape android:shape="rectangle">
            <solid android:color="@color/transparent" />
            <corners android:radius="12sp" />
            <stroke android:width="10sp" android:color="@color/start_button_color_selector"/>
        </shape>
    </item>
</selector>

start_button_color_selector

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/black" android:state_pressed="true"/>
    <item android:color="@color/gray"/>
</selector>

但是,无论是预览版还是模拟器都没有给出预期的结果。
预览不显示任何边框,模拟器显示紫色边框\

预期(点击时所有颜色都变为黑色):

但这里是 xml 设计模式下的预览:

这是它在模拟器中显示的内容 (API 30):

也试过了:
将 Button 更改为 androidx.appcompat.widget.AppCompatButton
去除描边标签内的颜色
任何帮助都会很棒!

编辑:对不起,如果我没有说清楚。问题是按下时不改变颜色,使用上面的 xml 文件,按钮在按下时已经能够改变颜色。我遇到的问题是边框在预览中是透明的,而在模拟器中是紫色的,这不是我预期的灰色/黑色。

【问题讨论】:

    标签: android xml android-studio android-layout android-button


    【解决方案1】:

    您可以使用Material Button 实现此目的。您可以根据自己的需要使用许多有用的属性来制作按钮,例如 app:strokeWidthapp:strokeColorapp:cornerRadiusapp:backgroundTintapp:iconapp:iconSize 等等,您可以在上面的链接中找到它们。

    以下是使用上述 Material Button 属性的 Button 示例:

    <com.google.android.material.button.MaterialButton
            android:id="@+id/button"
            android:layout_width="200dp"
            android:layout_height="100dp"
            android:padding="0dp"
            android:insetLeft="0dp"
            android:insetTop="0dp"
            android:insetRight="0dp"
            android:insetBottom="0dp"
            app:cornerRadius="12dp"
            app:strokeWidth="10dp"
            app:strokeColor="@color/start_button_color_selector"
            app:backgroundTint="@android:color/white"
            app:icon="@drawable/button_selector"
            app:iconTint="@null"
            app:iconSize="80dp"
            app:iconGravity="textStart"
            app:iconPadding="0dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"/>
    

    @color/start_button_color_selector.xml 将如下所示根据选中/未选中状态设置笔触颜色:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:color="@android:color/black" android:state_pressed="true"/>
        <item android:color="#969292"/>
    </selector>
    

    @drawable/button_selector 将如下所示根据选中/未选中状态设置正确的矢量图标:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/ic_arrow_black_right_24dp" android:state_pressed="true"/>
        <item android:drawable="@drawable/ic_arrow_gray_right_24dp"/>
    </selector>
    

    而@drawable/ic_arrow_black_right_24dp 是一个示例黑色选定箭头:

    <vector android:autoMirrored="true" android:height="24dp"
        android:tint="@android:color/black" android:viewportHeight="24"
        android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
        <path android:fillColor="@android:color/black" android:pathData="M12,4l-1.41,1.41L16.17,11H4v2h12.17l-5.58,5.59L12,20l8,-8z"/>
    </vector>
    

    而@drawable/ic_arrow_gray_right_24dp 是一个示例灰色未选中箭头:

    <vector android:autoMirrored="true" android:height="24dp"
        android:tint="#969292" android:viewportHeight="24"
        android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
        <path android:fillColor="#969292" android:pathData="M12,4l-1.41,1.41L16.17,11H4v2h12.17l-5.58,5.59L12,20l8,-8z"/>
    </vector>
    

    未选中状态的最终结果将是:

    选择/点击状态的最终结果是:

    【讨论】:

      【解决方案2】:

      你应该从你的代码中删除这一行。

      app:backgroundTint="@color/start_button_color_selector"

      【讨论】:

      • 谢谢你的回答,但是好像没有区别(预览和模拟器删除后都和上面的截图一样)
      【解决方案3】:

      您可以创建一个预期结果的向量并将其作为背景应用于 按钮,然后在其上应用一个 android:state_pressed

      【讨论】:

      • 感谢您的回答,您能详细说明一下吗?因为我认为我正在做你引用的事情。我展示的 start_button_color_selector 正在应用按下状态。事实上,当我按下时,矢量和边框都在改变颜色,但问题是边框在模拟器中是紫色的,而在预览中是透明的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 2012-08-09
      • 2020-09-03
      相关资源
      最近更新 更多