我正在尝试制作一个自定义视图,将接受@null
对某些属性
<declare-styleable name="CustomButton">
<attr name="icon" format="reference"/>
</declare-styleable>
我想要这个参数接受@null
当我在属性中读取它时,我如何发现@null
被输入而不是完全不设置此属性?
<CustomButton
....
app:icon="@null"
/>
val icon = ta.getDrawable(R.styleable.CustomButton_icon)
what comes here?
所以我做了我的研究,我发现这些观点很有用,并得出了我的结论。它可能对你有帮助。
首先,如果你有一些自定义属性,在这种情况下,icon
当你为它指定一些可绘制的引用时即实际存在的可绘制引用,例如
app:icon = "@drawable/some_drawable_that_does_exist"
getDrawable()
返回相应的可绘制对象。
第一点:如果在XML中不提到图标会怎样?(你不是在这里写@null
)
在这种情况下,getDrawable()将简单地返回null作为drawable
第2点:如果在XML中提到图标为@null
会怎么样?
在这种情况下,getDrawble()将返回null作为可绘制
就像我之前说的,你可以在做这样的操作之前使用一个简单的检查
val icon : Drawable? = ta.getDrawable(R.styleable.CustomButton_icon)
注意类型是Drawable?也就是nullable
即使你没有明确提到它它仍然会给你一个nullable
类型的可绘制
那么现在,一个简单的条件
if(icon!=null) {
// Do your stuff here if it's not null
}else {
// Do your overriding behaviour if it's null
}
但等待。在XML中提到@null
的目的是什么,如果它仍然给你null作为值,同样的事情发生在XML中没有提到任何东西。
那么如何克服这一点呢?
为了克服这个问题,你需要在你的styles.xml文件中为图标设置一个全局绘制,如下所示
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<item name="icon">@drawable/some_drawable_that_does_exists</item>
</style>
注意:这是AppTheme
无论你是否在xml中提到,我们都会有一个通用的可绘制视图
即使你在XML中提到一个图标,提到的图标也会被用来呈现视图。
现在,如果你在XML的视图中提到@null,你在代码中提到的覆盖条件就会生效,你可以在那里做任何你想做的事情。
谢谢。
注意事项:
- 将您的自定义属性命名为唯一的,以便它们不会与现有的android属性发生冲突