为什么按钮的背景色在Android Studio中不改变

kokeuurv  于 2023-05-12  发布在  Android
关注(0)|答案(1)|浏览(297)

我试图改变点击后的按钮的风格。
我的计划:当用户点击按钮时,它会改变背景颜色(橙子->白色),边框(无->橙色边框),文本颜色(白色->绿色)。
但是当我用可绘制的形状(如here所示的边框)时,它将背景颜色更改为橙子(笔触颜色)而不是白色(正如我在形状中为实心和buttonPressed.setBackgroundColor函数中为pressSemButton方法所写的那样)。
如果我不使用带边框的可绘制形状,它可以工作,背景颜色变为白色。
我的改变按钮样式的函数:

public void pressSemButton(Button buttonPressed, Button button) {
        buttonPressed.setBackground(getResources().getDrawable(R.drawable.orange_white_border));
        buttonPressed.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.white));
        buttonPressed.setTextColor(getResources().getColor(R.color.green_dark));

    }

橙子_白色_border的XML:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
    <solid android:color="@color/white" />
    <corners android:radius="30dp"/>
    <stroke android:width="2dp" android:color="@color/orange_light"/>
</shape>

片段XML中按钮的XML代码:

<Button
            android:id="@+id/firstSemesterButton"
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:text= "@string/buttonFirstSem"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_weight="1"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            />

我可以做什么来改变按钮的背景颜色为白色,并实现橙子_white_border的边框?

ecr0jaav

ecr0jaav1#

你尝试实现的方式有点过时了。Material Design Library引入了许多新的库和功能。我将描述一步一步如何实现有一个按钮,在你的问题。

1.创建颜色资源文件夹

在Android Studio中,在【项目】面板中,右键单击【res】文件夹,然后选择【新建】-【Android资源目录】。在弹出的窗口中,选择资源类型颜色res文件夹下将创建color目录。

2.在颜色资源中添加所需颜色

现在我们需要在颜色资源文件中定义颜色,如下所示:

<color name="white">#FFFFFFFF</color>
<color name="material_orange_400">#FF3D00</color>
<color name="material_green_400">#00E676</color>
3.创建颜色选择器资源

右键单击第一步中添加的color文件夹,选择new->Color Resource File。确保根元素selector
将新文件命名为bg_selector,因为它将控制背景颜色。重复此步骤,再创建2个文件,分别命名为stroke_selectortext_selector
这里我将列出3个文件的内容:
1.bg_selector.xml

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

1.stroke_selector.xml

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

1.text_selector

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

这些选择器是由Android自动管理的,所以当检测到按钮按下时,您不需要设置任何内容,因为我们使用了android:state_pressed="true"。使用此属性定义的颜色仅在按钮处于按下状态时显示。对于其余的状态,系统将显示第二项的颜色。

4.在xml中配置按钮。

现在让我们看看我们的按钮在xml中应该是什么样子。

<Button
    android:id="@+id/button_first"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="32dp"
    android:layout_marginEnd="32dp"
    android:backgroundTint="@color/bg_selector"
    android:text="Click me!"
    android:textColor="@color/text_selector"
    app:cornerRadius="48dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:strokeColor="@color/stroke_selector"
    app:strokeWidth="2dp" />

尽管按钮的默认样式是Material,但如果像cornerRadiusstrokeColor这样的属性没有出现,请确保将按钮的样式设置为@style/Widget.MaterialComponents.Button,以便使用这些属性。
最后,您应该会得到以下结果:
对于正常状态x1c 0d1x
对于按压状态

如你所愿!

相关问题