Articles of 科特林

Kotlin:可以为空的属性委托可观察

在Kotlin中,我们可以为非null属性定义一个observable, var name: String by Delegates.observable(“”) { prop, old, new -> println(“$old -> $new”) } 但这是不可能的 var name: String? by Delegates.observable(“”) { prop, old, new -> println(“$old -> $new”) } 为可空属性定义observable的方法是什么? 编辑:这是编译错误 Property delegate must have a ‘setValue(DataEntryRepositoryImpl, KProperty, String?)’ method. None of the following functions is suitable: public abstract operator fun setValue(thisRef: Any?, property: […]

项目不会与Kotlin 1.1.3一起构建

我有一个我最近使用1.1.3更新的Android项目,每次构建时都会出现以下错误: Error:Execution failed for task ‘:app:compileDebugJavaWithJavac’. > kotlin.jvm.internal.FunctionReference.(ILjava/lang/Object;)V 其他问题通常说这意味着stdlib不包括在内,但我肯定已添加它。 尽管使用1.1.2-5但1.1.3适用于其他项目。 解 问题在于我将注释处理器与kapt混合在一起。 对于像DbFlow和Glide这样的项目,annotationProcessor依赖项可以直接与kapt一起使用。 回到原来的问题: 这是我的Travis日志,下面是我的依赖项: dependencies { compile fileTree(dir: ‘libs’, include: [‘*.jar’]) androidTestCompile(‘com.android.support.test.espresso:espresso-core:2.3-alpha’, { exclude group: ‘com.android.support’, module: ‘support-annotations’ }) testCompile ‘junit:junit:4.12’ compile(“ca.allanwang:kau:${KAU}”) compile “org.jetbrains.kotlin:kotlin-stdlib-jre7:${KOTLIN}” testCompile “org.jetbrains.kotlin:kotlin-test-junit:${KOTLIN}” debugCompile “com.squareup.leakcanary:leakcanary-android:${LEAK_CANARY}” releaseTestCompile “com.squareup.leakcanary:leakcanary-android-no-op:${LEAK_CANARY}” releaseCompile “com.squareup.leakcanary:leakcanary-android-no-op:${LEAK_CANARY}” testCompile “com.squareup.leakcanary:leakcanary-android-no-op:${LEAK_CANARY}” compile “com.github.Raizlabs.DBFlow:dbflow:${DBFLOW}” compile “com.github.Raizlabs.DBFlow:dbflow-core:${DBFLOW}” annotationProcessor “com.github.Raizlabs.DBFlow:dbflow-processor:${DBFLOW}” kapt “com.github.Raizlabs.DBFlow:dbflow-processor:${DBFLOW}” compile “com.github.Raizlabs.DBFlow:dbflow-kotlinextensions:${DBFLOW}” […]

build.gradle文件中的compileKotlin块抛出错误“找不到参数的方法compileKotlin()”

我正在尝试将Kotlin配置为在我的Android项目中使用Java 1.8。 我已经尝试在build.gradle文件的底部添加compileKotlin块,但如果我这样做,我会收到错误。 发生的错误如下: 错误:(38,0)无法在types为org.gradle.api.Project的项目’:core’上find参数[build_dvcqiof5pov8xt8flfud06cm3 $ _run_closure4 @ 66047120]的方法compileKotlin()。 没有这个块,项目运行良好。 我错过了什么? 这是完整的build.gradle文件,它是非常基本的东西: apply plugin: ‘com.android.library’ apply plugin: ‘kotlin-android’ android { compileSdkVersion 25 buildToolsVersion ‘25.0.2’ defaultConfig { minSdkVersion 24 targetSdkVersion 25 versionCode 1 versionName ‘1.0.0’ testInstrumentationRunner ‘android.support.test.runner.AndroidJUnitRunner’ } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’ } } } dependencies { compile ‘com.android.support:appcompat-v7:25.3.1’ compile “org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version” […]

Kotlin中的Room Persistence lib实现

我正在kotlin中实现Room persistence lib来实现我的数据库。 以下是我的Entity , Dao和Database类: Food.kt @Entity class Food(@ColumnInfo(name = “food_name”) var foodName: String, @ColumnInfo(name = “food_desc”) var foodDesc: String, @ColumnInfo(name = “protein”) var protein: Double, @ColumnInfo(name = “carbs”) var carbs: Double, @ColumnInfo(name = “fat”) var fat: Double) { @ColumnInfo(name = “id”) @PrimaryKey(autoGenerate = true) var id: Long = 0 @ColumnInfo(name = “calories”) var […]

使用Kotlin在Android上的UI组件上声明的最佳方法是什么?

我正在尝试首次使用Kotlin构建Android应用程序。 我想在OnCreate方法之外的一些按钮上声明,我只能初始化它们在这个函数中使用findViewById。 我可以在java中简单而干净的代码中声明吗? private Button btnProceed; 因为在将其转换为Kotlin时,它看起来像: private var btnProceed: Button? = null 然后在初始化OnClick函数时需要添加! 标志: btnProceed!!.setOnClickListener 什么是正确和最干净的方式?

Android – 在Android 8上隐藏键盘

我在Android 8上隐藏键盘时遇到了麻烦。我之前使用过它,它适用于较旧的机器人: val view = activity.currentFocus if (view != null) { val imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.hideSoftInputFromWindow(view.windowToken, 0) } Android 8只是忽略了它并且无论如何都显示了键盘。 可能使输入字段不可聚焦会有所帮助,但我真的需要它可以集中精力,所以这不是一个选择。

如何使用Kotlin setOnEditorActionListener

所以我有这个Java代码: editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { doSomething(); return true; } return false; } }); 我设法得到了这个(我甚至不确定它是正确的方式): editText.setOnEditorActionListener() { v, actionId, event -> if(actionId == EditorInfo.IME_ACTION_DONE){ doSomething() } else { } } 但我得到一个错误Error:(26, 8) Type mismatch: inferred type is kotlin.Unit but kotlin.Boolean was expected […]

不推荐使用getActionView吗?

今天我决定将我的Android应用程序从Java翻译成Kotlin! :)但是当我输入这个时我很惊讶: val searchItem = menu.findItem(R.id.action_search) val searchView = MenuItemCompat.getActionView(searchItem) as SearchView Android Studio告诉我:“’getActionView(MenuItem!):查看!’ 不推荐使用。在Java中弃用“ 所以在问你解决方案之前我问谷歌解决方案是什么,我相信我find了解决方案:“直接使用getActionView()。” 所以我修改了我的代码: val searchView = MenuItemCompat.getActionView() as SearchView 但getActionView()仍然交叉,所以我根本不明白…… 如果你能帮助我,我会很高兴:)谢谢!

未解决的参考:在使用kapt时,Kotlin在清理后需要2个构建来获取代码

在我们的Android应用程序中,我们使用DBFlow来访问SQLite数据库。 我们通过Kotlin引用DBFlow生成的类。 我们已经意识到我们拥有模型类以及Java中的数据库类,因为在Kotlin中编写这些类时,代码生成将不起作用 。 但是,我们仍然需要在每个项目清理后两次构建代码。 在设备上执行第一次构建会导致看似随机的Kotlin类的ClassNotFoundExceptions (即使它们不访问由DBFlow或我们定义的任何模型类生成的代码)。 在启用Proguard的编译时已经报告了相同的内容,当然这个版本无法构建。 第二次构建总是成功的。 有趣的是,代码生成已经在第一次运行时工作 – 类在那里并且也被IDE选中。 但编译器以某种方式找不到它们让我认为代码生成在构建过程中发生得太晚了。 另一方面,如上所述,还存在未find的类,其不必对代码生成和/或注释处理做任何事情。 那么这个问题比第二次构建有更好的解决方案吗? 作为参考,我们的app的build.gradle的相关部分看起来像这样 – 就像DBFlow文档建议的那样: def dbflow_version = “3.0.0-beta4” dependencies { kapt “com.github.Raizlabs.DBFlow:dbflow-processor:${dbflow_version}” compile “com.github.Raizlabs.DBFlow:dbflow-core:${dbflow_version}” compile “com.github.Raizlabs.DBFlow:dbflow:${dbflow_version}” } kapt { generateStubs = true } 编辑:我发现每次对代码所做的更改都需要重建两次。 如果我之前没有清理过它,它会在第一个构建中正确编译,但是这些更改根本就没有被拾取。

Kotlin属性访问语法如何用于Java类(即EditText setText)?

我正在尝试将我的Android项目切换到Kotlin。 我有一个EditText ( TextView的子TextView ),我想以编程方式设置提示和文本。 提示按预期工作。 但是对于文本,如果我尝试使用Kotlin setter语法,我会遇到types不匹配exception: val test = EditText(context) test.setHint(“hint”) // Lint message: “Use property access syntax” test.hint = “hint” // ok test.setText(“text”) // ok (no lint message) test.text = “text” // Type mismatch: inferred type is kotlin.String but android.text.Editable! was expected 如果我们查看声明,我们将find从TextViewinheritance的相同签名: public final void setHint(CharSequence hint) public final void setText(CharSequence […]