Articles of 科特林

Kotlin lateinit属性,NPE危险吗?

我正在使用lateinit属性,以避免连续的空值检查? 运营商。 我有很多在getViews()函数中第一次分配的View属性。 如果那个函数不存在,我的应用程序将从Kotlin代码中的NPE崩溃。 在我看来,lateinit属性基本上破坏了语言的漂亮的null安全function。 我知道它们是在M13中引入的,因为它有更好的框架支持,但是它值得吗? 或者我在这里遗漏了什么? 这是代码: package com.attilapalfi.exceptional.ui import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.view.View import android.widget.Button import android.widget.ImageView import android.widget.TextView import com.attilapalfi.exceptional.R import com.attilapalfi.exceptional.dependency_injection.Injector import com.attilapalfi.exceptional.model.Exception import com.attilapalfi.exceptional.model.ExceptionType import com.attilapalfi.exceptional.model.Friend import com.attilapalfi.exceptional.persistence.* import com.attilapalfi.exceptional.rest.ExceptionRestConnector import com.attilapalfi.exceptional.ui.helpers.ViewHelper import com.attilapalfi.exceptional.ui.question_views.QuestionYesNoClickListener import com.google.android.gms.maps.MapView import java.math.BigInteger import javax.inject.Inject public class ShowNotificationActivity : AppCompatActivity(), QuestionChangeListener { @Inject lateinit […]

Kotlin中的RecyclerView itemClickListener

在使用Android 3年后,我正在Kotlin编写我的第一个应用程序。 只是混淆了如何在Kotlin中使用itemClickListener和RecyclerView。 我已经尝试了特征(编辑:现在界面)方法,非常类似于Java public class MainActivity : ActionBarActivity() { protected override fun onCreate(savedInstanceState: Bundle?) { // set content view etc go above this line class itemClickListener : ItemClickListener { override fun onItemClick(view: View, position: Int) { Toast.makeText(this@MainActivity, “TEST: ” + position, Toast.LENGTH_SHORT).show() } } val adapter = DrawerAdapter(itemClickListener()) mRecyclerView.setAdapter(adapter) } trait ItemClickListener { fun […]

IllegalArgumentException:savedInstanceState指定为Non-Null为Null

当我启动MainActivity时出现一个奇怪的错误: 06-16 16:01:05.193 2083-2083/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.android.example.github, PID: 2083 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.example.github/com.android.example.github.ui.MainActivity}: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2666) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6121) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) Caused by: java.lang.IllegalArgumentException: Parameter specified […]

必须初始化variables’runnable’

为什么Kotlin抱怨这个: class MyActivity : Activity { private var handler:Handler = Handler() private var runnable: Runnable = Runnable { /* Do something very important */ handler.postDelayed(this@MyActivity.runnable, 5000) } } 编译器抱怨Variable ‘runnable’ must be initialized在Line中Variable ‘runnable’ must be initialized它是否由处理程序再次发布。 这在纯Java中有效: private Handler handler = new Handler(); private Runnable runnable = new Runnable() { @Override public void run() […]

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只是忽略了它并且无论如何都显示了键盘。 可能使输入字段不可聚焦会有所帮助,但我真的需要它可以集中精力,所以这不是一个选择。