代码之家  ›  专栏  ›  技术社区  ›  Lena Bru

@自定义视图中为null

  •  0
  • Lena Bru  · 技术社区  · 5 年前

    我正在尝试制作一个可以接受的自定义视图 @null 在某些房产上

     <declare-styleable name="CustomButton">
        <attr name="icon" format="reference"/>
    </declare-styleable>
    

    我希望接受此参数 @null

    当我在attrs上读到它时,我是怎么知道的 @null 是否输入了该属性,而不是根本没有设置该属性?

    <CustomButton 
      .... 
      app:icon="@null"
    />
    
            val icon = ta.getDrawable(R.styleable.CustomButton_icon)
               what comes here?
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   AgentP    5 年前

    所以我做了研究,发现这些观点很有用,并得出了我的结论。这可能对你有帮助。

    首先,如果你有一些自定义属性,在这种情况下, icon 当您指定一些可绘制的引用时,例如实际存在的可绘制引用

    app:icon = "@drawable/some_drawable_that_does_exist"
    

    这个 getDrawable() 返回所述的相应可绘制内容。

    第1点:如果你在XML中没有提到图标怎么办?(你不写 @null 这里)

    在这种情况下,getDrawable()将简单地返回null作为可绘制对象

    第2点:如果你提到图标 @null XML?

    在这种情况下,getDrawble()也将简单地返回null作为可绘制对象

    正如我之前所说,在进行这样的操作之前,你可以使用一个简单的检查

    val icon : Drawable? = ta.getDrawable(R.styleable.CustomButton_icon)
               
    

    注意类型是可绘制的吗?即 nullable 即使你没有明确提及,它仍然会给你一个 可以为null 可拉伸类型

    现在,一个简单的条件

    if(icon!=null) {
       // Do your stuff here if it's not null
    }else {
       // Do your overriding behaviour if it's null
    }
    

    但是等等。提及的目的是什么 @null 在XML中,如果它仍然给你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属性冲突