Android资源ID突然不是最终的,switch()'破坏了

Sev*_*yev 17 eclipse android compiler-errors

我有一段时间的Java Android项目.今天,我已经将Android开发工具更新为Google的最新版本.而且项目破了 - 我得到了一堆"case表达式必须是常量表达式"的编译错误信息.

事实证明,R.java文件现在以不同方式生成.以前,它会有一堆

public static final int MyID=0x12340000;
Run Code Online (Sandbox Code Playgroud)

报表; 现在,它看起来(在清理/重建之后)像这样:

public static int MyID=0x12340000;
Run Code Online (Sandbox Code Playgroud)

final离开了.所以我拥有的资源ID的所有开关(我都有一些)是错误的.怎么了,拜托?只有我吗?这里的理由是什么?是否记录在任何地方?我能final以某种方式带回来吗?

Phi*_*art 24

这发生在昨天,当SDK/ADT 14发布时:

从ADT 14开始,图书馆项目中的资源常量不再是最终的.这在http://tools.android.com/tips/non-constant-fields中有更详细的解释

ADT 14提供了一个quickfix:http://tools.android.com/recent/switchstatementconversion

引用理由:

组合多个库项目时,字段的实际值(必须是唯一的)可能会发生冲突.在ADT 14之前,所有字段都是最终字段,因此,所有库都必须在使用它们时将所有资源和相关Java代码与主项目一起重新编译.这对性能不利,因为它使构建非常慢.它还阻止了分发不包含源代码的库项目,限制了库项目的使用范围.

字段不再是最终的原因是它意味着库jar可以编译一次并直接在其他项目中重用.除了允许分发二进制版本的库项目(来自r15),这使得构建速度更快.

  • 这只是Android团队做出愚蠢的设计决定的结果.每当你看到一些带有一些幻数常量的生成文件时,你应该看看它很有趣.谢谢,Google因完全缺乏远见而打破了一堆开发人员的源代码.公共静态整数.好多了?! (4认同)
  • 实际上是有道理的.我知道他们来自哪里.事实上,Android库只是链接源而不是编译库,这对我来说一直是个小问题.此外,感谢Google提供魔法重构器. (2认同)
  • 这个答案被标记为解决方案 - 但我没有看到它...非常好的讨论、建议、文档链接等...具体的解决方案是什么?我应该在代码中更改哪些内容来解决该问题 - 请简述一下?还是没有解决办法?- 那么请用一个词回答:“不”。? (2认同)
  • 这会让你做很多额外的工作,并对你的代码做很多不必要的修改,只需在 gradle.properties 文件中添加 android.nonFinalResIds=false 即可。 (2认同)

M. *_*mor 13

只需添加括号即可:

switch (view.getId()) {
    case (R.id.view1):
        break;
    case (R.id.view2):
        break;
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么这有效?这样做安全吗? (5认同)
  • 这样做的唯一作用是可能使检测器错过这种情况。但它并不能解决 ids 实际上是非最终的情况(Java 编译器将不会编译此代码)。所以它充其量只是一个创可贴(它所做的只是消除警告,但并不能解决问题)。 (2认同)

Avi*_*han 9

您可以切换到使用 If/Else 语句,警告就会消失。

样本:

    @Override
    public void onClick(final View v) {
        //finds which button was pressed
        final int buttonView = v.getId();
        String current = fromEditText.getText().toString();
        if (buttonView == R.id.bA) {
            current += getString(R.string.a);
        } 
Run Code Online (Sandbox Code Playgroud)

  • ❤️ 好一个! (7认同)

DJT*_*ano 6

Google 建议您使用if/else 条件

http://tools.android.com/tips/non-constant-fields

要自动更改它们,您可以将插入符号放在关键字上,然后在 Windows 上switchAlt+ (在 Mac 上按 + ),然后选择将“switch”替换为“if”EnterOptionEnter