【问题标题】:How to change button background colour without changing onclick/onpress colors如何在不更改 onclick/onpress 颜色的情况下更改按钮背景颜色
【发布时间】:2015-07-22 07:52:36
【问题描述】:

我想知道这是否可能,但希望有人能够确认。

我在 XML 中创建了一个简单的自定义按钮布局来处理聚焦/按下和休眠状态。请参阅底部的代码。当我用它来创建一个新按钮时,这很好用。但是,如果用户不喜欢默认设置,我希望用户能够通过颜色选择器更改按钮颜色。但是,我知道以编程方式更改按钮背景颜色的唯一方法是使用

mybutton.setBackgroundColor(someothercolor);

但如果我这样做,它会覆盖所有 XML 布局代码,并且在按下按钮时我会丢失颜色变化。我想这是设计使然,因为我实际上是在覆盖整个背景样式,但我真正想做的是允许用户在未按下自定义按钮时更改按钮颜色,但保留其他状态的样式和布局按钮可能在(即按下时会发生什么)。

有什么想法吗?

提前谢谢你。

纳特

<?xml version="1.0" encoding="utf-8"?>


<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:state_pressed="false" android:drawable="@color/originalbuttoncolor" />
    <item android:state_focused="true" android:state_pressed="true" android:drawable="@color/someotherbuttoncolor" />
    <item android:state_focused="false" android:state_pressed="true" android:drawable="@color/someotherbuttoncolor" />
    <item android:drawable="@color/originalbuttoncolor" />
</selector>

【问题讨论】:

  • 我看到的解决方案是将颜色六进制保存到数据库中,然后每次设置按钮时,它都会使用保存的颜色
  • 感谢所有 cmets。听起来没有简单的方法可以做到这一点,并且创建一个数据库只是为了允许按钮颜色更改似乎有点矫枉过正。如果人们真的想改变按钮颜色,也许我最好只创建几个主题或者干脆失去按下状态的颜色。如果有人有任何更简单的解决方案,那么我会全力以赴,再次感谢大家的关注。

标签: java android android-studio


【解决方案1】:

也许您可以考虑以编程方式创建 ColorStateList,如下所述:How do I create ColorStateList programmatically?

【讨论】:

    【解决方案2】:

    你可以试试这个:
    1.去掉默认颜色&lt;item android:drawable="@color/originalbuttoncolor" /&gt;
    2.那么:

    `StateListDrawable ret = (StateListDrawable) res.getDrawable(R.drawable.btn_selector);
        ret.addState(new int[] {}, new ColorDrawable(your_desire_color));
        mybutton.setBackgroundDrawable(ret);`
    

    【讨论】:

      【解决方案3】:

      您可以创建选择器列表的多个文件,每个文件包含不同的颜色作为默认颜色,并将这些文件链接到颜色选择器,这样您就可以保存选择器的逻辑。

      例如:

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

      还有:

      <?xml version="1.0" encoding="utf-8"?>
      <selector xmlns:android="http://schemas.android.com/apk/res/android">
          <item android:state_focused="true" android:state_pressed="false" android:drawable="@color/yellowbuttoncolor" />
          <item android:state_focused="true" android:state_pressed="true" android:drawable="@color/someotherbuttoncolor" />
          <item android:state_focused="false" android:state_pressed="true" android:drawable="@color/someotherbuttoncolor" />
          <item android:drawable="@color/originalbuttoncolor" />
      </selector>
      

      编辑:如果您想从用户那里获取颜色,这可能会起作用,如果选择器状态将被此代码覆盖:

      ColorDrawable cd = new ColorDrawable(); // initialize it from the color picker;
      StateListDrawable states = (StateListDrawable) mybutton.getBackground();
      states.addState(new int[] {-android.R.attr.state_pressed, android.R.attr.state_focused}, cd); // the minus means false value
      mybutton.setBackground(states);
      

      【讨论】:

      • 感谢您的提醒。我确实考虑过这样做,但它确实将颜色的数量限制为您/我可能会费心创建的多个选择器列表。我真正在寻找的是一种允许用户选择他们想要的任何颜色的方法。
      • 是的,但如果他使用颜色选择器怎么办?他将制造数百万个选择器
      • 如果您不想用颜色编号限制用户,我编辑了我的答案。不确定它是否会起作用,但可能会进行一些修改(例如基于 2 个常量状态和由您转换为 ColorDrawable 的用户颜色定义的状态创建新的 StateListDrawable)
      • 我尝试了上面的代码,尽管它编译并运行它并没有;似乎没有改变任何东西。还是谢谢!
      猜你喜欢
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      相关资源
      最近更新 更多