2015-12-09 179 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支持。这解决了我的问题。