我开发Android应用程序并经常使用注释作为编译时参数检查,主要是android的支持注释.
java代码中的示例:
public class Test
{
@IntDef({Speed.SLOW,Speed.NORMAL,Speed.FAST})
public @interface Speed
{
public static final int SLOW = 0;
public static final int NORMAL = 1;
public static final int FAST = 2;
}
@Speed
private int speed;
public void setSpeed(@Speed int speed)
{
this.speed = speed;
}
}
Run Code Online (Sandbox Code Playgroud)
由于Android中的性能问题,我不想使用枚举.kotlin的自动转换器只生成无效代码.如何@IntDef
在kotlin中使用注释?
当前的build.gradle.kts:
android {
// ...
variantFilter {
ignore = run {
val isSim = flavors[0].name == "sim"
val isNet = !isSim
val isU = flavors[1].name == "custom"
val isMain = !isU
val buildType = buildType.name
val isDebug = buildType == "debug"
val isRelease = buildType == "release"
(isSim && isRelease) ||
(isSim && isU)
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何在新版本的插件中创建类似的配置?
更新:使用答案,上面的代码如下:
android {
androidComponents.beforeVariants {
it.enabled = run {
val isSim = it.productFlavors[0].second == "sim"
val isNet = !isSim
val isU = …
Run Code Online (Sandbox Code Playgroud) 我有android库项目,这取决于其他Android库项目.我需要为库生成javadoc,但它失败了,因为gradle将javadoc类路径路径放到.aar位置,但javadoc需要.jar文件.
简化的gradle文件:
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
configurations {
javadocDeps
}
defaultConfig {
minSdkVersion 7
targetSdkVersion 23
versionCode 1
versionName "0.1.0"
}
}
dependencies {
compile 'com.android.support:support-v4:23.2.0'
compile 'com.android.support:appcompat-v7:23.2.0'
compile 'com.nineoldandroids:library:2.4.0'
compile 'com.annimon:stream:1.0.7'
javadocDeps 'com.android.support:support-annotations:23.2.0'
javadocDeps 'com.nineoldandroids:library:2.4.0'
javadocDeps 'com.android.support:support-v4:23.2.0'
}
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
task javadoc(type: Javadoc, dependsOn: explodeAars) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
classpath += configurations.javadocDeps
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts …
Run Code Online (Sandbox Code Playgroud) android javadoc gradle android-library android-gradle-plugin
我创建了一个简单的测试项目:目标是通过按下屏幕上的按钮来显示消息"hello".第一个flavor构建应该将消息写入系统日志.第二个风味构建应该显示带有消息的祝酒词.请问如何使用gradle实现这一目标?
我的build.gradle:
apply plugin: 'android'
android {
compileSdkVersion 19
buildToolsVersion "19.0.1"
defaultConfig {
minSdkVersion 14
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
productFlavors {
toast {
}
log {
}
}
sourceSets {
main {
java.srcDirs = ['src/main/java', 'src/log/java']
}
toast {
java.srcDirs = ['src/main/java', 'src/toast/java']
}
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
}
Run Code Online (Sandbox Code Playgroud)
文件结构:
Flavor log
包含单类Messenger …
旧问题已过时(通过build.gradle任务在项目目录中创建version.txt文件)
我目前的任务:
task exportVersion {
def file = project.layout.buildDirectory.file("version.txt")
def f = file.get().asFile
f.text = "$project.android.defaultConfig.versionName"
}
Run Code Online (Sandbox Code Playgroud)
这是一个稍微重写的任务,用于删除gradle 5.0的"不兼容"更改,但仍会显示警告:
不推荐使用DefaultSourceDirectorySet构造函数.计划在Gradle 5.0中删除.请使用ObjectFactory服务来创建SourceDirectorySet的实例.
不推荐使用ProjectLayout.directoryProperty()方法.计划在Gradle 5.0中删除.请改用ObjectFactory.directoryProperty()方法.
不推荐使用ProjectLayout.fileProperty()方法.计划在Gradle 5.0中删除.请改用ObjectFactory.fileProperty()方法.
如何使用ObjectFactory重写任务?该项目是一个Android应用程序,但我认为这不是变更任务.
我经常编写非常复杂的 toString() 方法,这个问题总是困扰着我——哪个变体更容易阅读。下面的例子是简化的,通常有很多条件,所以单行不适合。
1) 就像在普通的 Java 中一样:
val sb = StringBuilder()
sb.append(data)
val string = sb.toString()
Run Code Online (Sandbox Code Playgroud)
2) apply + toString() - 不是很漂亮吗?
val string = StringBuilder().apply {
append(data)
}.toString()
Run Code Online (Sandbox Code Playgroud)
3) run + toString() 最后一条语句也不是很好
val string = StringBuilder().run {
append(data)
toString()
}
Run Code Online (Sandbox Code Playgroud)
4) ??
简单的任务:通过按下按钮,它将X值缩放为0,当动画完成时,在第二个视图上开始另一个动画,将X从0缩放到1.应该播放1秒的反向动画,这就是全部.在下面运行代码我有动画第一部分的无限动画循环.
使用了nineoldandroids lib,但我认为这与原生动画框架至少在jelly bean设备上并没有什么不同.
public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final View mybutton = findViewById(R.id.mybutton);
final View myprogress = findViewById(R.id.myprogress);
mybutton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
animate(mybutton).scaleX(0).setListener(new AnimatorListenerAdapter()
{
@Override
public void onAnimationEnd(Animator animation)
{
mybutton.setVisibility(View.INVISIBLE);
myprogress.setVisibility(View.VISIBLE);
ViewHelper.setScaleX(myprogress, 0f);
animate(myprogress).scaleX(1).setListener(new AnimatorListenerAdapter()
{
@SuppressWarnings("ConstantConditions")
@Override
public void onAnimationEnd(Animator animation)
{
mybutton.getHandler().postDelayed(new Runnable()
{
@Override
public void run()
{
animate(myprogress).scaleX(0).setListener(new AnimatorListenerAdapter()
{
@Override
public void onAnimationEnd(Animator animation)
{
myprogress.setVisibility(View.INVISIBLE);
mybutton.setVisibility(View.VISIBLE);
ViewHelper.setScaleX(mybutton, …
Run Code Online (Sandbox Code Playgroud)