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

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&lt;member-variable-CamelCase-name&gt;,但我认为这就是现在所发生的一切。 @mz496 以上不适用于 xml 中定义的属性

以上是关于如何以编程方式设置自定义组件的自定义属性?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式更新 WooCommerce 产品中设置的自定义属性值

在 FrameLayout 中的自定义视图上以编程方式设置边距值

Delphi 自定义组件,拖动时无法在设计器中定位(顶部/左侧属性的自定义设置器)

删除以编程方式创建的自定义按钮的边框

更改以编程方式创建的自定义 inputAccessoryView 的高度?迅速 4

如何将 Vuetify 注入我的自定义 vue 插件