自定义视图中的 @null



我正在尝试制作一个自定义视图,将接受@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,你在代码中提到的覆盖条件就会生效,你可以在那里做任何你想做的事情。

谢谢。

注意事项:

  1. 将您的自定义属性命名为唯一的,以便它们不会与现有的android属性发生冲突

相关内容

  • 没有找到相关文章

最新更新