2015-12-09 177 views
66

我想嘗試在Android Studio中使用Kotlin和Kotlin Android擴展。我已經在Ubuntu 14.04上的Android Studio v 1.5.1以及OS X El Capitan上的Android Studio v 1.5.1上嘗試了這一點,獲得了相同的結果。未解決的參考:kotlinx

下面是我在做什麼:

  1. 我安裝插件科特林1.0.0-β-35950-IJ141-11
  2. 創建一個新的空白Android項目
  3. 在MainActivity文件轉換科特林(通過幫助 - > findaction->轉換文件科特林)
  4. 配置項目科特林

然後我進入產生CON tent_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> 

然後在轉換的MainActivity中添加一行來設置TextView。 (如下所示)。 Android Studio中,然後提示我(通過Alt-Enter組合)在這一點上一切似乎精細

但隨後插入這條線(如下所示)

import kotlinx.android.synthetic.main.content_main.* 

所以,當我嘗試編譯這個我得到

Unresolved reference: kotlinx 
Unresolved reference: kotlinx 
Unresolved reference: hello 

注意,我並沒有安裝的科特林的Android擴展插件。就在幾天前,現在這應該被包含在主插件中,並被標記爲過時。 (事實上​​,如果您在安裝最新插件時嘗試安裝它,則不會安裝任何新軟件)

任何人都看到我在做什麼錯了?

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) 
    } 
} 

回答

131

加入我們buildscript的依賴性kotlin-android-extensions

1.在項目級的build.gradle

buildscript { 
    dependencies { 
     classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" 
    } 
} 

和應用kotlin-android-extensions插件:

2.在模塊級的build.gradle

apply plugin: 'kotlin-android-extensions' 

原來的答覆:

最有可能的是在科特林插件的錯誤。我已在他們的跟蹤器上提交了issue

+1

這就是我所做的,但我仍然得到1.0.0-beta-3595的問題:( –

+0

不適用於我(1.0.0-beta-4589) - 任何解決方案嗎?只需添加評論在bug bug跟蹤器中出現錯誤 –

+10

我在1.0.0-beta-4589上也有這個問題,你還必須在你的build.gradle文件中添加'apply plugin:'kotlin-android-extensions'' –

6

我發現我的原因沒有奏效。我的塊被放錯了地方,並通過插件如下之前移動buildscript{}塊我得到它的工作:

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" 
} 
+0

這對我有效,你會碰巧知道爲什麼修復它嗎? – Joe

+0

唯一的答案顯示'apply插件:'kotlin-android-extensions''需要被添加到的位置...... +1 – Zelphir

+0

但是爲什麼這個修復呢? –

9

包含科特林,Android系統的擴展依賴的buildscript塊顯然需要在應用程序模塊的build.gradle ,不在頂層。

+0

我認爲這會是這樣的;我的業力大部分來自回答類似問題的gradle問題。 –

30

我找不到它在official documentation,但你必須通過添加應用插件下面你build.gradle文件:

apply plugin: 'kotlin-android-extensions' 
+0

是的,我認爲自'kotlin-1.0.0-beta'以來,您需要應用該插件,但我無法找到該插件的源代碼!謝謝! – Orgmir

+1

注意:官方文檔已更新:https://kotlinlang.org/docs/tutorials/android-plugin。html#using-kotlin-android-extensions – Maxime

+1

請求對接受的答案進行編輯並追加此信息! :) – vyscond

31

當您使用Android Studio 2.0及科特林1.0.1-2,你會想出同樣的錯誤。您水溼配置項目的科特林的build.gradle Android的擴展,需要在每一個模塊的的build.gradle這樣的配置和Android的科特林擴展:

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" 
} 

最重要的,甚至通過科特林插件包含在科特林Android的擴展,你還需要配置你的模塊bulid.gradle的科特林,Android系統的擴展是這樣的:

... 
apply plugin: 'kotlin-android-extensions' 
... 
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" 

當然,你可以在你的項目的build.gradle配置科特林插件的類路徑。

+0

那個人爲我做了詭計。謝謝。 – Marlon

+1

在我的情況下(Android Studio 2.1.1,kotlin 1.0.2)「在項目中配置kotlin」動作在project build.gradle中配置了kotlin而不是Module的build.gradle,這有所幫助。 –

0

這是如何爲我工作的。 當我在第一項目配置科特林,我所選擇的1.1.2-3版本,而不是1.1.2-4和之後,在應用程序的build.gradle文件

apply plugin: 'kotlin-android-extensions' 

加入以下行我同步生成並按預期工作。

2

add apply plugin: 'kotlin-android-extensions' in app/buildgradle

如果您已經添加了它,嘗試刪除它並同步gradle,當同步完成時,然後將其添加回來並再次同步Gradle。這爲我工作。

0

我發現我在支持C++和Kotlin的同時造成了構建問題。

啓動新項目時,確保未選中C++支持,並且選中了Kotlin支持。這解決了我的問題。