【问题标题】:Change Button's enabled color without changing disabled color更改按钮的启用颜色而不更改禁用颜色
【发布时间】:2018-05-04 17:40:07
【问题描述】:

我将元素 Button 用于我的 xml 布局。 按钮类来自android.widget,它扩展了TextView

此视图可以通过 java 代码标记为启用或禁用。 .setEnabled(true|false).

按钮xml代码

<Button
    android:id="@+id/maps_list_save_button"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="@string/str_save"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent" />

我想要什么:

当我的按钮启用时,我想给他一个紫色。

当我的按钮被禁用时,得到一个灰色。

我不想做的事:

创建一个新元素并包含布局,我避免这样做是因为我想保留选定的动画、提升、填充、高度等。再次创建所有内容并不聪明。

我已经尝试过的:

改变背景 = 它松动了内部填充,是什么让按钮变大了,我想保持材料设计的“规则”

更改主题 = 我尝试通过编辑器和代码更改主题,但发生了两件事:或者我更改了更多不是按钮的内容,或者我更改了相同的启用和禁用颜色。

即使寻找文档我也没有找到如何正确使用这个元素。

【问题讨论】:

  • 您是否尝试过使用selector
  • @MdSufiKhan 在哪里以及如何?

标签: android android-view android-button android-theme android-styles


【解决方案1】:

您需要专门为 Button 更改 android:colorAccent 值。这可以通过将主题应用于Button 来实现。

styles.xml 内部引入以下变化:

<style name="PurpleTheme" parent="AppTheme">
    <item name="android:colorAccent">#8654e2</item>
</style>

然后在xml文件中声明以下两个按钮,其中第一个按钮为启用状态,第二个按钮为禁用状态。

<Button
    style="@style/Widget.AppCompat.Button.Colored"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button 1"
    android:theme="@style/PurpleTheme" />

<Button
    style="@style/Widget.AppCompat.Button.Colored"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:enabled="false"
    android:text="Button 2"
    android:theme="@style/PurpleTheme" />

注意,按钮已应用:

  • style="@style/Widget.AppCompat.Button.Colored"
  • android:theme="@style/PurpleThemeOverlay"

然后你会得到以下输出:

【讨论】:

  • 只使用style="@style/Widget.AppCompat.Button.Colored" 已经可以了,谢谢!我还不能赏金,但我会
  • @Canato,这意味着您已将colorAccent 应用于活动的主题。如果您希望活动以不同的accentColor 为主题,而按钮为另一种颜色,那么这是正确的方法。此外,请随意奖励赏金,只要有人可能会提出更好的答案。这个答案将自动获得,只要它是一个被接受的答案。谢谢。
  • @Canato,稍微改变了答案。不需要ThemeOverlays。
  • 我的 IDE 告诉我我需要 api 级别 21 才能使用 android:colorAccent。较低 api 的解决方法是什么?
  • 在我的情况下,我使用与上面相同的方法,但它适用于 android:colorPrimarycolorPrimary
【解决方案2】:

您可以使用如下选择器来实现此目的

 <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

  <item android:state_enabled="true">
    <shape
        android:shape="rectangle">
      <solid android:color="Your Color"></solid>
      <corners android:radius="5dp"></corners>
      <padding android:bottom="2dp" android:left="2dp"
          android:right="2dp" android:top="2dp"></padding>
    </shape>
  </item>
  <item android:state_enabled="false" android:drawable="@color/colorAccent"/>

</selector>

【讨论】:

  • 我如何把它放在按钮元素中?
  • @Canato 使用这个 android:background ="@drawable/selector.xml"
  • 我写在这个问题上,如果我改变背景,我会失去内部填充等。你可以在“我已经做了什么 > 改变背景”中看到 =)
  • 就这个问题发帖吧。提前感谢您的帮助
  • @Canato 我理解你的问题。我已经更新了我的答案,请检查一下。这是发生的,因为按钮有一个默认的背景和左右的内在填充,因为我们正在改变它发生的背景。希望我的回答对提问有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 2021-04-18
  • 1970-01-01
  • 2020-08-03
相关资源
最近更新 更多