【问题标题】:How to programmatically set custom attributes of custom components?如何以编程方式设置自定义组件的自定义属性?
【发布时间】:2015-11-22 12:50:35
【问题描述】:

我有一个名为CircleView 的自定义组件,我想更改attrs.xml 中定义的名为fillColor 的自定义属性:

<declare-styleable name="CircleView">
    <attr name="radius" format="integer" />
    <attr name="fillColor" format="color" />
</declare-styleable>

我最初在我的布局 XML 中设置了它,目前看起来像这样(命名空间 circleview 被定义为 xmlns:circleview="http://schemas.android.com/apk/res-auto";当我在 XML 中定义它时它工作正常,所以这应该不是问题) :

<com.mz496.toolkit.CircleView
     ...
     circleview:fillColor="#33ffffff"/>

我可以在我的CircleView 中很好地获取fillColor 属性,它扩展了View,但我不知道如何设置它的值。

我调查了setBackgroundColor 之类的东西,并寻找了其他“设置”方法,但我找不到任何东西。我想象了一个像

这样的方法

circle.setAttribute(R.styleable.CircleView_fillColor, "#33ff0000")

【问题讨论】:

标签: android custom-component


【解决方案1】:

布局中的CircleView只不过是CircleView类的一个实例,所以只需在CircleView.java中添加一个函数即可:

public void setFillColor(int newColor) {
    fillColor = newColor;
}

然后在需要时调用它:

CircleView circle_view = (CircleView) findViewById(R.id.circle_view);
circle_view.setFillColor(0x33ffffff);
circle_view.invalidate();

还要注意,这只是改变了一个内部变量,但是你仍然需要使用View类的invalidate()方法重绘自定义组件,因为自定义组件只有在整个视图被重绘时才会自动重绘,例如切换片段时(参见:Force a View to redraw itself)。

(当我刚要问“我需要自己定义这个吗?”时,我在最后想通了这一点,我尝试自己定义它,它奏效了。)

【讨论】:

  • 是的,现有的 Android 工具中没有任何东西可以自动添加与属性对应的访问器,部分原因是这可能不是所有用例的正确答案。我不知道有任何第三方库提供此功能,但我当然可以看到有人在滚动注释处理器,试图进行这种代码生成。
  • 对,Android Studio 默默地尝试通过自动完成方法名称来提供帮助(在输入 public void set 后,它会建议 set&lt;member-variable-CamelCase-name&gt;,但我认为这就是现在所发生的一切。
  • @mz496 以上不适用于 xml 中定义的属性
猜你喜欢
  • 2013-05-26
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
相关资源
最近更新 更多