Kotlin 删除按钮的背景色
Kotlin remove button's background tint
我正在尝试为 Android Studio 项目中的按钮设置自定义背景行为,但是 backgroundTint
颜色一直干扰我的自定义可绘制资源。
当我将 backgroundTint
设置为新颜色时,我仍然无法使 background
正常工作。这只是色调。
出于某种原因,如果我不设置我的自定义 backgroundTint
颜色,它只会复制 colorPrimary
。
我的 xml
文件中也有 android:background="@drawable/rounded_button_state"
,我尝试以编程方式设置背景颜色 btnSelectFile.setBackgroundResource(R.drawable.rounded_button_state)
,不过,我想避免以编程方式设置它,因为我相信解决方案一定更简单。
我的 rounded_button_state.xml
可绘制对象 xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/background_dark_teal_rounded_corners"
android:state_pressed="true" />
<item android:drawable="@drawable/background_bluish_rounded_corners"
android:state_pressed="false" />
</selector>
我的 background_dark_teal_rounded_corners.xml
可绘制对象 xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:alpha="125">
<shape android:shape="rectangle">
<solid android:color="@color/dark_teal"/>
<corners android:radius="6dp"/>
</shape>
</item>
</selector>
我的 background_bluish_rounded_corners.xml
可绘制对象 xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:alpha="125">
<shape android:shape="rectangle">
<solid android:color="@color/bluish_grey"/>
<corners android:radius="6dp"/>
</shape>
</item>
</selector>
我的main_activity.xml是:
<?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_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_centerHorizontal="true"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tvFileName"
android:gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
<Button
android:id="@+id/btnSelectFile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/rounded_button_state"
android:text="@string/tvSelectFile" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
在我的 values/themes.xml
我有:
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
我的完整 values/themes.xml
文件如下所示:
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.TestFragmentUpdate" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- 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>
我在 themes
文件夹中的第二个文件 night/themes.xml
如下所示:
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.TestFragmentUpdate" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/bluish_grey</item>
<item name="colorPrimaryVariant">@color/dark_teal</item>
<!-- <item name="colorOnPrimary">@color/black</item>-->
<!-- Secondary brand color. -->
<!-- <item name="colorSecondary">@color/teal_200</item>-->
<!-- <item name="colorSecondaryVariant">@color/teal_200</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>
这是我将 backgroundTint
设置为我自己的自定义颜色:
那是我删除自定义 backgroundTint
颜色并使用主要颜色的时候:
我假设你使用的是普通 Button
然后你设置了 style
,不要这样做:
style="@style/Widget.AppCompat.Button.Colored"
或者您可能正在使用 MaterialButton
。
无论如何,文档说不要更改背景:
All attributes from MaterialButton are supported. Do not use the
android:background attribute. MaterialButton manages its own
background drawable, and setting a new background means MaterialButton
can no longer guarantee that the new attributes it introduces will
function properly. If the default background is changed,
MaterialButton cannot guarantee well-defined behavior.
如果你想使用自定义背景,我看到你有一个 drawable
用于此目的,请使用普通的 Button
.
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/myBackground"/>
编辑:
您的主题样式使按钮成为 MaterialButton
所以现在您可以做两件事:
-> 您可以将完整主题更改为普通主题:
<style name="Theme.TestFragmentUpdate" parent="Theme.AppCompat.Light.DarkActionBar">
这将更改您应用的完整主题。
-> 您可以只更改按钮主题
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.TestFragmentUpdate" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/bluish_grey</item>
<item name="colorPrimaryVariant">@color/dark_teal</item>
<item name="buttonStyle">@android:style/Widget.Button</item>
<!-- <item name="colorOnPrimary">@color/black</item>-->
<!-- Secondary brand color. -->
<!-- <item name="colorSecondary">@color/teal_200</item>-->
<!-- <item name="colorSecondaryVariant">@color/teal_200</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>
此外,我认为您可以将此具体样式(默认样式)设置为按钮,然后只需设置您需要的背景,这样您就不会修改整个主题:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@android:style/Widget.Button"
android:background="@drawable/myBackground"/>
我正在尝试为 Android Studio 项目中的按钮设置自定义背景行为,但是 backgroundTint
颜色一直干扰我的自定义可绘制资源。
当我将 backgroundTint
设置为新颜色时,我仍然无法使 background
正常工作。这只是色调。
出于某种原因,如果我不设置我的自定义 backgroundTint
颜色,它只会复制 colorPrimary
。
我的 xml
文件中也有 android:background="@drawable/rounded_button_state"
,我尝试以编程方式设置背景颜色 btnSelectFile.setBackgroundResource(R.drawable.rounded_button_state)
,不过,我想避免以编程方式设置它,因为我相信解决方案一定更简单。
我的 rounded_button_state.xml
可绘制对象 xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/background_dark_teal_rounded_corners"
android:state_pressed="true" />
<item android:drawable="@drawable/background_bluish_rounded_corners"
android:state_pressed="false" />
</selector>
我的 background_dark_teal_rounded_corners.xml
可绘制对象 xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:alpha="125">
<shape android:shape="rectangle">
<solid android:color="@color/dark_teal"/>
<corners android:radius="6dp"/>
</shape>
</item>
</selector>
我的 background_bluish_rounded_corners.xml
可绘制对象 xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:alpha="125">
<shape android:shape="rectangle">
<solid android:color="@color/bluish_grey"/>
<corners android:radius="6dp"/>
</shape>
</item>
</selector>
我的main_activity.xml是:
<?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_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_centerHorizontal="true"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tvFileName"
android:gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
<Button
android:id="@+id/btnSelectFile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/rounded_button_state"
android:text="@string/tvSelectFile" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
在我的 values/themes.xml
我有:
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
我的完整 values/themes.xml
文件如下所示:
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.TestFragmentUpdate" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- 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>
我在 themes
文件夹中的第二个文件 night/themes.xml
如下所示:
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.TestFragmentUpdate" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/bluish_grey</item>
<item name="colorPrimaryVariant">@color/dark_teal</item>
<!-- <item name="colorOnPrimary">@color/black</item>-->
<!-- Secondary brand color. -->
<!-- <item name="colorSecondary">@color/teal_200</item>-->
<!-- <item name="colorSecondaryVariant">@color/teal_200</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>
这是我将 backgroundTint
设置为我自己的自定义颜色:
那是我删除自定义 backgroundTint
颜色并使用主要颜色的时候:
我假设你使用的是普通 Button
然后你设置了 style
,不要这样做:
style="@style/Widget.AppCompat.Button.Colored"
或者您可能正在使用 MaterialButton
。
无论如何,文档说不要更改背景:
All attributes from MaterialButton are supported. Do not use the android:background attribute. MaterialButton manages its own background drawable, and setting a new background means MaterialButton can no longer guarantee that the new attributes it introduces will function properly. If the default background is changed, MaterialButton cannot guarantee well-defined behavior.
如果你想使用自定义背景,我看到你有一个 drawable
用于此目的,请使用普通的 Button
.
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/myBackground"/>
编辑:
您的主题样式使按钮成为 MaterialButton
所以现在您可以做两件事:
-> 您可以将完整主题更改为普通主题:
<style name="Theme.TestFragmentUpdate" parent="Theme.AppCompat.Light.DarkActionBar">
这将更改您应用的完整主题。
-> 您可以只更改按钮主题
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.TestFragmentUpdate" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/bluish_grey</item>
<item name="colorPrimaryVariant">@color/dark_teal</item>
<item name="buttonStyle">@android:style/Widget.Button</item>
<!-- <item name="colorOnPrimary">@color/black</item>-->
<!-- Secondary brand color. -->
<!-- <item name="colorSecondary">@color/teal_200</item>-->
<!-- <item name="colorSecondaryVariant">@color/teal_200</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>
此外,我认为您可以将此具体样式(默认样式)设置为按钮,然后只需设置您需要的背景,这样您就不会修改整个主题:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@android:style/Widget.Button"
android:background="@drawable/myBackground"/>