如何以编程方式设置自定义组件的自定义属性?

20

我有一个自定义组件叫做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属性,但我不知道如何设置它的值。我已经调查过像setBackgroundColor这样的东西,并寻找其他“set”方法,但我找不到。我想象了一个方法,像这样:

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


你可能也可以在这里找到答案: https://dev59.com/XbTma4cB1Zd3GeqP6nJy - Jack'
1个回答

9
在布局中的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() 方法重新绘制自定义组件,因为只有在整个视图被重绘时自定义组件才会自动重绘,例如切换片段时(请参见:强制 View 重新绘制)。 (当我即将询问“我需要自己定义这个吗?”时,我发现了这一点,并尝试自己定义,它很有效。)

是的,在原始的Android工具中没有自动添加对应属性访问器的功能,部分原因是因为这可能并不适用于所有的使用情况。我不知道是否有第三方库提供此功能,但我可以想象会有人编写注解处理器来尝试进行此类代码生成。 - CommonsWare
对的,Android Studio 会默默地尝试帮助你自动完成方法名称(在输入“public void set”后,它会建议“set<成员变量驼峰命名>”),但我认为目前只有这些。 - mz496
@mz496 上述方法不适用于在XML中定义的属性。 - Subham Burnwal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接