【问题标题】:Android: programmatically setId is gives a warning Expected resource of type idAndroid:以编程方式 setId 给出警告 Expected resource of type id
【发布时间】:2016-04-11 09:50:41
【问题描述】:

我不知道为什么会这样:

如果我写如下代码:

TextView textView = new TextView(this);
textView.setId(1);

1 作为 id 不起作用并给我一个警告,例如:

它不适用于以下值:

textView.setId(0+1);   // Valid
textView.setId(var++); // Valid even var=0

但无效

textView.setId(1);     // Invalide

有人知道吗?谁能解释一下?

【问题讨论】:

  • 我认为它正在考虑 + 警告符号,因为 + 在通过 xml 提供 id 时也存在
  • 你为什么要设置id?
  • 我只是想知道为什么会这样。由于动态视图,我设置了 id 。 @Alexey
  • @VivekMishra 当我不给 + 号时,我会收到警告。
  • @PratikButani 对于任何整数,无论​​是正数还是负数,它都会给我同样的警告。 Lint 很傻,可能是像[+-]?[0-9]+ 这样的正则表达式

标签: android android-view android-resources android-identifiers


【解决方案1】:

此警告由android lint 生成。它会检查您是否使用正确类型的 ID 作为标识符。这个函数的签名是:

public void setId(@IdRes int id)

因此,lint 会检查您使用的正是 @IdRes 类型的 id(请参阅 IdRes annotation),而不是 @ColorRes@StringRes(它检查您使用的是 R.id 类中的常量)

通过使用 0+1var++ 之类的表达式(顺便说一句,结果实际上是 0 而不是 1),您会妨碍 lint 推断参数类型。

【讨论】:

    【解决方案2】:

    您会收到警告,因为设置您自己的 ID 可能很危险,例如,您可以设置与现有 xml 元素相同的 ID,这显然会发生冲突并导致问题。请改用View.generateViewId() 来防止这种情况。

    【讨论】:

    • 你真的这么认为吗??
    • 你给一个 xml 元素的名字 (android:id="...") 被解析成一个整数,这将是一个非常大的数字,比如 28858383 什么的,假设这样可以可以以编程方式将重复的 id 设置为另一个视图。通过使用 View.generateViewId() 方法,您可以确保没有任何 ID 会与现有元素发生冲突。另外,如果我没记错的话,生成的 ID 将从 1 开始并上升。
    • Possibility 你说的。这将在运行时而不是编译时检查。
    猜你喜欢
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    相关资源
    最近更新 更多