Question or issue of Kotlin Programming:
I am trying to try out Kotlin and the Kotlin Android extensions in Android Studio. I have tried this both in Android Studio v 1.5.1 on Ubuntu 14.04, and in Android Studio v 1.5.1 on OS X El Capitan with the same result.
Here is what I am doing:
I then go into the generated content_main.xml file and add an id (hello) for the “Hello World!” TextView.
Then in the converted MainActivity I add a line to set the TextView. (shown below).
Android Studio then prompts me (via alt-enter) to insert this line (also shown below)
import kotlinx.android.synthetic.main.content_main.*
So at this point everything seems fine
but then when I try to compile this I get
Unresolved reference: kotlinx Unresolved reference: kotlinx Unresolved reference: hello
Notice that I did not install the Kotlin Android extensions plugin. As of a couple of days ago this is now supposed to be included in the main plug in and is marked as obsolete. (In fact if you try to install it when you have the latest plugin, nothing new is installed)
Anyone see what I am doing wrong?
MainActivity
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 android.view.Menu import android.view.MenuItem import kotlinx.android.synthetic.main.content_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val toolbar = findViewById(R.id.toolbar) as Toolbar setSupportActionBar(toolbar) print("setting text view value to hey") hello.text = "hey" val fab = findViewById(R.id.fab) as FloatingActionButton fab.setOnClickListener { view -> Snackbar.make(view, "Replace this with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show() } } override fun onCreateOptionsMenu(menu: Menu): Boolean { // Inflate the menu; this adds items to the action bar if it is present. menuInflater.inflate(R.menu.menu_main, menu) return true } override fun onOptionsItemSelected(item: MenuItem): Boolean { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. val id = item.itemId //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true } return super.onOptionsItemSelected(item) } }
How to solve this issue?
Solution no. 1:
Add kotlin-android-extensions
in our buildscript’s dependencies:
1. In your project-level build.gradle
buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" } }
and apply the kotlin-android-extensions
plugin:
2. In your module-level build.gradle
apply plugin: 'kotlin-android-extensions'
Original answer:
Most likely it’s a bug in the Kotlin plugin. I’ve filed an issue on their tracker.
Solution no. 2:
When you use Android Studio 2.0 and kotlin 1.0.1-2, you will come up with the same wrong. You cann’t configure kotlin android extensions in your project’s build.gradle, you need to configure and kotlin android extensions in every Module’s build.gradle like this:
apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' buildscript { ext.kotlin_version = '1.0.1-2' repositories { jcenter() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" } } android { compileSdkVersion 23 buildToolsVersion "24.0.0 rc2" defaultConfig { applicationId "com.dazd.kotlindemo" minSdkVersion 14 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } sourceSets { main.java.srcDirs += 'src/main/kotlin' } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.3.0' compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" }
Most importantly, even through the kotlin plugin included the kotlin android extension, you also need to configure the kotlin-android-extensions in your Module’s bulid.gradle like this:
... apply plugin: 'kotlin-android-extensions' ... classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
Of course, you could configure the kotlin plugin’s classpath in your project’s build.gradle.
Solution no. 3:
I can’t find it in the official documentation, but you must apply the plugin by adding the following to your build.gradle
file:
apply plugin: 'kotlin-android-extensions'
Solution no. 4:
The buildscript block containing the kotlin-android-extensions dependency apparently needs to be in the app-module build.gradle, not in the top-level one.
Solution no. 5:
I found why mine didn’t work. My blocks were misplaced and by moving the buildscript{}
block before the plugins as follow I got it working:
buildscript { ext.kotlin_version = '1.0.0-beta-3595' ext.anko_version = '0.8.1' repositories { jcenter() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" } } apply plugin: 'com.android.application' apply plugin: 'kotlin-android' android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.kotlin" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } sourceSets { main.java.srcDirs += 'src/main/kotlin' } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" compile "org.jetbrains.anko:anko-sdk15:$anko_version" compile "org.jetbrains.anko:anko-support-v4:$anko_version" }
Solution no. 6:
add apply plugin: 'kotlin-android-extensions'
in app/buildgradle
.
if you have already added it, try to remove it and sync gradle, when sync is complete, then add it back and Sync Gradle again. This work for me.
Solution no. 7:
Removing the following import fixed the issue for me.
import android.R
Solution no. 8:
The problem for me was the order in which I applied the plugins.
You must apply the kotlin-android plugin before the kotlin-android-extensions plugin
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions'
Solution no. 9:
After applying the fixes mentioned above, I had to restart Android Studio to make it work.
Solution no. 10:
What worked for me in Android Studio 4.2 Beta 1 in macOS big sur to add id 'kotlin-android-extensions'
to plugin section in app-level build.gradle
file. So that it should look as follows.
plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-android-extensions' }
Then sync the project and it should work
Solution no. 11:
This is how it worked for me.
When I first configured Kotlin in Project, I selected the 1.1.2-3 version instead of 1.1.2-4 and added the following line in the build.gradle app file
apply plugin: 'kotlin-android-extensions'
after that I synced the build and it worked as expected.
Solution no. 12:
I found out that I had support for C++ and Kotlin at the same time which was causing build problems.
When starting a new project, ensure C++ support is unchecked, and Kotlin support is checked. That fixed the problem for me.
Solution no. 13:
In my case, I had put the code referring the view in a companion object
. How silly..
Solution no. 14:
For me the only thing that helped was to click “File” -> “Invalidate caches / Restart…”