2017-07-23 33 views
0

我有一个模型,其中一个setter期望Color Resource,但它不能直接使用上述资源而不解决(通过使用ContextCompat)。限制方法来接受由ContextCompat解决的资源

有没有一种方法可以注释我的方法来指示/限制它?

public class SimpleModel { 
    private String name; 
    private int bgColor; 
    private int bgImage; 

    public String getName() { 
     return name; 
    } 

    public void setName(final String name) { 
     this.name = name; 
    } 

    public int getBgColor() { 
     return bgColor; 
    } 

    public void setBgColor(@ColorInt final int bgColor) { 
     this.bgColor = bgColor; 
    } 

    public int getBgImage() { 
     return bgImage; 
    } 

    public void setBgImage(@DrawableRes final int bgImage) { 
     this.bgImage = bgImage; 
    } 
} 

我所知道的@ColorRes@ColorInt - 但他们不完全解决我的问题。

这是一个注释可以照顾我吗? JavaDocs怎么样?

如果不是 - 我如何检查传递的资源是否可用?

+0

“我有一个模型,其中一个setter期望的颜色资源” - 这不是你的问题中的模型,就像我可以告诉的那样。您正在接受'@ ColorInt'(已经解析)和'@ DrawableRes'(它不是一种颜色资源)。 – CommonsWare

+0

@CommonsWare所以没有办法限制用户只发送'R.color.red'而不是'ContextCompat.getColor(context,R.color.red);' 我意识到我没有构造这个问题尽我所能。 – avluis

+0

“因此,没有办法限制用户只发送R.color.red而不是ContextCompat.getColor(context,R.color.red)” - 具体比较应该由'@ ColorInt'捕获。 'R.color.red'不是一个颜色整数,而是一个颜色资源ID。因此,在你的问题中,我期望'model.setBgColor(R.color.red)'产生一个Lint错误,而'model.setBgColor(ContextCompat.getColor(context,R.color.red)) '不会。 – CommonsWare

回答

1

@ColorRes表示参数是颜色资源ID的要求。

@ColorInt实际上是@!ColorRes,如果在注释中应用“not”运算符是可能的。它表示参数是不是颜色资源ID的int的要求。

所以,你public void setBgColor(@ColorInt final int bgColor)方法应该导致以下:

  • model.setBgColor(R.color.red):皮棉错误

  • model.setBgColor(getColor(R.color.red)):没有错误

  • model.setBgColor(ContextCompat.getColor(this, R.color.red)):没有错误

如果出于某种原因需要区分后两种情况...我认为没有办法做到这一点。

+0

谢谢你这样分手 - 非常容易理解这种方式! – avluis