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

时间:2011-10-20 19:06:03

标签: android eclipse compiler-errors

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

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

public static final int MyID=0x12340000;

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

public static int MyID=0x12340000;

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

4 个答案:

答案 0 :(得分: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代码与main一起重新编译   项目使用时。这对性能不利,因为   它使构建非常慢。它还阻止了分发库   不包含源代码的项目,限制了使用范围   图书馆项目。

     

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

答案 1 :(得分:2)

您可以切换到使用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);
        } 

答案 2 :(得分:0)

只需将此片段添加到您的模块级from PIL import Image, ImageFilter def prepare_image(img): """Transform image to greyscale and blur it""" img = img.convert('RGB') img = img.filter(ImageFilter.SMOOTH_MORE) img = img.filter(ImageFilter.SMOOTH_MORE) if 'L' != img.mode: img = img.convert('L') return img def remove_noise(img, pass_factor): for column in range(img.size[0]): for line in range(img.size[1]): value = remove_noise_by_pixel(img, column, line, pass_factor) img.putpixel((column, line), value) return img def remove_noise_by_pixel(img, column, line, pass_factor): if img.getpixel((column, line)) < pass_factor: return (0) return (255) img = Image.open("captcha.png") img = prepare_image(img) img = remove_noise(img, 115) img.save("result.png") 文件中即可:

build.gradle

更多: https://developer.android.com/studio/write/lint#gradle

答案 3 :(得分:-2)

您应该使用view binding

android {
    ...
    viewBinding {
        enabled = true
    }
}