如何以编程方式设置自定义组件的自定义属性?
Posted
技术标签:
【中文标题】如何以编程方式设置自定义组件的自定义属性?【英文标题】: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")
【问题讨论】:
你也可以在这里找到答案:***.com/questions/56560657/… 【参考方案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<member-variable-CamelCase-name>
,但我认为这就是现在所发生的一切。
@mz496 以上不适用于 xml 中定义的属性以上是关于如何以编程方式设置自定义组件的自定义属性?的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式更新 WooCommerce 产品中设置的自定义属性值
在 FrameLayout 中的自定义视图上以编程方式设置边距值
Delphi 自定义组件,拖动时无法在设计器中定位(顶部/左侧属性的自定义设置器)