我正在将我的一些Java代码转换为Kotlin,我不太了解如何实例化Kotlin代码中定义的接口.作为一个例子,我有一个接口(在Java代码中定义):
public interface MyInterface {
void onLocationMeasured(Location location);
}
Run Code Online (Sandbox Code Playgroud)
然后在我的Kotlin代码中进一步实例化这个接口:
val myObj = new MyInterface { Log.d("...", "...") }
Run Code Online (Sandbox Code Playgroud)
它工作正常.但是,当我将MyInterface转换为Kotlin时:
interface MyInterface {
fun onLocationMeasured(location: Location)
}
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息:Interface MyListener does not have constructors当我尝试实例化它时 - 虽然在我看来除了语法之外没有任何改变.我是否误解了Kotlin界面的工作原理?
Kotlin中的单个感叹号是什么意思?我已经看过几次,特别是在使用Java API时.但我在文档和StackOverflow中都找不到它.
我有这段Java代码:
MaterialDialog builder = new MaterialDialog.Builder(MainActivity.this)
Run Code Online (Sandbox Code Playgroud)
我想在Kotlin中获取MainActivity对象.自动转换中断MainActivity.this.
我目前正在Java项目中使用优秀的AutoParcel,这有助于创建Parcelable类.
现在,我考虑用于我的下一个项目的Kotlin具有数据类的概念,它自动生成equals,hashCode和toString方法.
有没有一种方便的方法可以方便地使Kotlin数据类Parcelable(不手动实现方法)?
这一定是个愚蠢的问题,但我对Kotlin来说真的很新,我找不到任何解决方案.
如何声明类字段?就像我们可以在java中一样:
protected SharedPreferences mSharedPreferences;
Run Code Online (Sandbox Code Playgroud)
后来在onCreate():
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
Run Code Online (Sandbox Code Playgroud)
现在我可以在任何我想要的地方使用它(在这个基本活动的子类中).
我试着在Kotlin做同样的事情:
protected var sharedPreferences : SharedPreferences
Run Code Online (Sandbox Code Playgroud)
并在onCreate():
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
Run Code Online (Sandbox Code Playgroud)
但我得到一个警告:"财产必须初始化或是抽象的"
在Java中,要声明常量,您可以执行以下操作:
class Hello {
public static final int MAX_LEN = 20;
}
Run Code Online (Sandbox Code Playgroud)
Kotlin的等价物是什么?
我更新了 Android Studio 4.2,但无法创建新项目 kotlin
A problem occurred configuring root project 'My Application'.
> Could not resolve all artifacts for configuration ':classpath'.
> Could not find org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.0-release-764.
Searched in the following locations:
- https://dl.google.com/dl/android/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.5.0-release-
764/kotlin-gradle-plugin-1.5.0-release-764.pom
- https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.5.0-release-764/kotlin-gradle-plugin-1.5.0-release-764.pom
Required by:
project :
Possible solution:
- Declare repository providing the artifact, see the documentation at
https://docs.gradle.org/current/userguide/declaring_repositories.html
Run Code Online (Sandbox Code Playgroud) 我试图在Android Studio中试用Kotlin和Kotlin Android扩展程序.我已经在Ubuntu 14.04上的Android Studio v 1.5.1和OS X El Capitan上的Android Studio v 1.5.1中尝试了这一点,结果相同.
这是我在做的事情:
然后我进入生成的content_main.xml文件并为"Hello World!"添加一个id(hello).TextView中.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.gmail.npnster.mykotlinfirstproject.MainActivity"
tools:showIn="@layout/activity_main">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:id="@+id/hello"
/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
然后在转换后的MainActivity中添加一行来设置TextView.(如下所示).Android Studio然后提示我(通过alt-enter)插入此行(也显示如下)
import kotlinx.android.synthetic.main.content_main.*
Run Code Online (Sandbox Code Playgroud)
所以在这一点一切似乎罚款
但是当我尝试编译这个时,我得到了
Unresolved reference: kotlinx
Unresolved reference: kotlinx
Unresolved reference: hello
Run Code Online (Sandbox Code Playgroud)
注意,我并没有安装科特林的Android扩展插件.截至几天前,现在应该将其包含在主插件中并标记为已过时.(事实上,如果您在使用最新插件时尝试安装它,则不会安装任何新内容)
有谁看到我做错了什么?
主要活动
import android.os.Bundle
import android.support.design.widget.FloatingActionButton
import android.support.design.widget.Snackbar
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar
import android.view.View
import …Run Code Online (Sandbox Code Playgroud)