该注释@RequiresApi有助于要求仅在给定的 API 级别或更高级别上调用带注释的元素。然而,似乎没有相应的注释来要求仅在给定的 API 或更低版本上调用带注释的元素。
例如,给出类似的内容:
@RequiresMaxApi(28) // or @DeprecatedSinceAndroid(29)
fun doSomethingWithExternalStorage() {
val dir = Environment.getExternalStorageDirectory() // This is deprecated in API 29
// ...
}
Run Code Online (Sandbox Code Playgroud)
doSomethingWithExternalStorage()从不包含检查的代码调用,例如:
if (VERSION.SDK_INT < 29) {
doSomethingWithExternalStorage()
}
Run Code Online (Sandbox Code Playgroud)
如果没有上述 API 检查,doSomethingWithExternalStorage()将显示 lint 错误/警告,类似于如何@RequiresApi显示。
据我了解,这也和工作原理类似@DeprecatedSinceKotlin。
是否有现有的注释可以满足这些要求,或者是否有其他方法可以达到预期的结果?
android backwards-compatibility android-appcompat android-annotations androidx
我使用最新的Android Annotations 2.6和IntelliJ IDEA.有时我总是对注释/类路径/编译顺序有问题.似乎不规律地发生.我今天早些时候编译了项目,然后稍后更改了res/layout-xml文件,然后我尝试构建项目并得到错误.
但是xml和java源文件中没有语法错误或任何内容.
问题是带注释的类没有找到它的原始类
cannot find symbol class Intro
Run Code Online (Sandbox Code Playgroud)
错误.
我的项目结构:
/src/
/app/activity/Intro
...
/gen-annotation-processed/
/app/activity/Intro_
...
/gen
...
Run Code Online (Sandbox Code Playgroud)
我的IDEA注释首选项:
处理器路径:
/path/to/project/ext-libs/androidannotations-2.6.jar
Run Code Online (Sandbox Code Playgroud)
处理器FQ名称:
com.googlecode.androidannotations.AndroidAnnotationProcessor
Run Code Online (Sandbox Code Playgroud)
项目的Android IDEA模块中的源文件夹:
gen
gen-annotation-processed
src
Run Code Online (Sandbox Code Playgroud)

构建项目时在IDEA中登录时出错(通过IDEA,没有ant或maven):

(类"简介"存在于src文件夹中,并且没有错误.)
更新:我现在正在使用它,虽然不知道在来回使用设置之后我改变了什么/在哪里.它可能实际上只是IDEA的一个问题而不是实际上与android-annotations相关,尚不确定.
通常似乎工作的是:做一个Rebuild(可能抛出编译错误,忽略).然后做一个Build(不是一个完整的重建).由于某些原因,多次编译运行在执行重建时无法正常工作,需要执行rebuild + build组合.
我有一个Gradle构建脚本,它使用注释处理器(Android Annotations)来生成代码.建筑物很好,直到我添加了一个新的Pro Flavor.我可以构建Free味道,但是当我构建Pro flavor时,注释处理器不会运行.这会导致代码丢失并且构建失败.
这是我的脚本:
buildscript {
repositories {
maven { url 'http://repo1.maven.org/maven2' }
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots/'
}
}
ext.androidAnnotationsVersion = '3.0-SNAPSHOT';
configurations {
apt
}
dependencies {
compile files('libs/android-support-v13.jar')
compile fileTree(dir: 'libs', include: '*.jar')
apt "org.androidannotations:androidannotations:${androidAnnotationsVersion}"
compile "org.androidannotations:androidannotations-api:${androidAnnotationsVersion}"
}
android {
compileSdkVersion 17
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 7
targetSdkVersion 17
versionCode 29
versionName "2.0.3"
packageName "com.MyCompany.MyApp"
}
productFlavors {
free …Run Code Online (Sandbox Code Playgroud) android gradle annotation-processing android-annotations android-studio
我无法在Eclipse首选项中设置注释处理的选项. 
不确定,因为我什么时候遇到这个问题但是在我最后更新eclipse之后肯定已经开始发生了.我也试过在工具/支持文件夹中粘贴annotations.jar文件,但没有好处.
请帮助.
TIA
我不清楚如何使用@Intdef作为这样的标志:
@IntDef(
flag = true
value = {NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
Run Code Online (Sandbox Code Playgroud)
这个例子直接来自文档.这究竟意味着什么?这是否意味着它们最初都设置为真?如果我在下面做"或":
NAVIGATION_MODE_STANDARD | NAVIGATION_MODE_LIST
Run Code Online (Sandbox Code Playgroud)
这是什么意思......我有点困惑,这里发生了什么.
我在库中使用@Retention和@StringDef注释我的一些方法,我面临一个奇怪的警告,我想了解.
在静态类中SIP,我使用此注释:
public static final String CODEC_SPEEX_16K = "speex/16000/1";
public static final String CODEC_SPEEX_8K = "speex/8000/1";
public static final String CODEC_SPEEX_32K = "speex/32000/1";
public static final String CODEC_ILBC_8K = "iLBC/8000/1";
public static final String CODEC_GSM_8K = "GSM/8000/1";
public static final String CODEC_PCMU_8K = "PCMU/8000/1";
public static final String CODEC_PCMA_8K = "PCMA/8000/1";
public static final String CODEC_G722_16K = "G722/16000/1";
@Retention(RetentionPolicy.CLASS)
@StringDef({
CODEC_SPEEX_16K,
CODEC_SPEEX_8K,
CODEC_SPEEX_32K,
CODEC_ILBC_8K,
CODEC_GSM_8K,
CODEC_PCMU_8K,
CODEC_PCMA_8K,
CODEC_G722_16K
})
public @interface CodecName {}
Run Code Online (Sandbox Code Playgroud)
编译很好,没有任何警告. …
我正在尝试在Android Studio中使用AndroidAnnotations创建项目.当我构建并运行项目时,一切似乎编译得很好,但我只得到应用程序的空白活动.此外,AndroidAnnotations似乎没有生成任何内容.
我已经添加了androidannotations-api-2.7.1.jar作为我的项目的依赖项,并启用了处理器路径的注释处理路径,该路径androidannotations-2.7.1.jar位于一个单独的文件夹中androidannotations-api-2.7.1.jar.我检查了存储生成的相对于模块内容根的源,并尝试了许多不同的源目录 - 从generated,到gen/aa,到(当前)build/source/aa匹配在Android Studio中创建生成文件的位置.没有任何效果.我已将清单中的活动名称更改为Activity_,并将配置设置为在项目运行时启动它.
我唯一的其他依赖项是android-support-v4和ActionBarSherlock.我试过这两个禁用,没有结果.我最初计划将Roboguice与AndroidAnnotations结合使用,但暂时禁用它以尝试专注于此问题.
我也在使用或试图使用Gradle.这是我目前的build.gradle:
buildscript {
repositories {
maven { url 'http://repo1.maven.org/maven2' }
}
dependencies {
classpath 'com.android.tools.build:gradle:0.4'
}
}
apply plugin: 'android'
dependencies {
compile files('libs/android-support-v4.jar')
compile files('libs/actionbarsherlock-4.3.1.jar')
compile files('libs/androidannotations-api-2.7.1.jar')
}
android {
compileSdkVersion 17
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 7
targetSdkVersion 17
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我还没有弄清楚Gradle是如何工作的,所以我大多只是手动添加依赖项,就像普通项目一样,然后将编译行放在Gradle中,这样项目就可以正常编译.我知道这可能不是使用它的正确方法.
我的活动及其布局是相当标准的,我只是从官方指南中复制它们以开始使用AndroidAnnotations.
更新:所以我回到Maven用它来测试构建,我注意到一些奇怪的东西.似乎即使我在Maven中设置了它,也没有生成任何东西.但是,使用Maven构建,我可以在不更改清单中的活动名称的情况下运行项目Activity_,项目将编译并正确运行.这是非常奇怪的,似乎它可以进一步混淆问题,或者如果它也表明了Gradle的某些东西,则可以简化它.
我正在尝试使用gradle来构建我的Android项目Android Annotations,但我仍然会遇到错误.在我的java类中找不到AA.
同样在gradle文件中我得到一些提示:
versionName"1.0"< - 'versionName'不能应用于'(java.lang.String)'
'build'中的'main'不能应用于'(groovy.lang.Closure)'
main {
manifest.srcFile 'src/main/AndroidManifest.xml'
java.srcDirs = ['src/main/java', 'GENERATED_FOLDER']
resources.srcDirs = ['src/main/resources']
res.srcDirs = ['src/main/res']
assets.srcDirs = ['src/main/assets']
}
Run Code Online (Sandbox Code Playgroud)
以下是我的完整gradle脚本:
buildscript {
repositories {
mavenCentral()
}
dependencies {
// replace with the current version of the Android plugin
classpath 'com.android.tools.build:gradle:0.9.2'
// the latest version of the android-apt plugin
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.1'
}
}
repositories {
mavenCentral()
mavenLocal()
}
apply plugin: 'android'
apply plugin: 'android-apt'
def AAVersion = '3.0.1'
dependencies {
// Android annotations
apt "org.androidannotations:androidannotations:$AAVersion" …Run Code Online (Sandbox Code Playgroud) 我正在Android Annotations和我合作,今天我做了新的更新Android Studio 1.0.
当我构建项目时它给了我这个错误:
Error:(40, 0) Could not find property 'processResources' on com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@54335f5.
Run Code Online (Sandbox Code Playgroud)
这是我的build.gradle文件my project:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
// the latest version of the android-apt plugin https://bitbucket.org/hvisser/android-apt
// http://stackoverflow.com/a/25939518
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
} …Run Code Online (Sandbox Code Playgroud) 我一直试图找出如何申请@IntRange(from = 1)我的 Kotlin 财产。经过几次失败的尝试,我终于在 Java 中创建了我想要的类,并将其转换为 Android Studio 中的 Kotlin。这是我的 Java 类:
import android.support.annotation.IntRange;
public class SimpleThing {
private int val;
@IntRange(from = 1)
public int getVal() {
return val;
}
public void setVal(@IntRange(from = 1) int val) {
this.val = val;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我从 Android Studio 得到的自动转换:
import android.support.annotation.IntRange
class SimpleThing {
@get:IntRange(from = 1)
var `val`: Int = 0
}
Run Code Online (Sandbox Code Playgroud)
在@IntRange似乎得到应用吸气剂,但不二传手。是否可以将此注释也应用于 setter,以便出现适当的 lint 警告。目前我刚刚覆盖了 set 方法来抛出一个 IllegalArgumentException 像这样:
@get:IntRange(from = 1)
var rowSize: …Run Code Online (Sandbox Code Playgroud) android kotlin android-lint android-annotations kotlin-interop
android ×10
gradle ×3
java ×2
android-lint ×1
androidx ×1
annotations ×1
build.gradle ×1
eclipse ×1
kotlin ×1