'Unresolved reference: java' 在 Android 工作室
'Unresolved reference: java' in Android Studio
作为背景,我正在开发我们教授提供的 Guess It 应用程序(入门应用程序来自 Udacity),并且我正在使用 Kotlin 创建一个 GameViewModel。我通过在 GameFragment class 的 onCreateView 上实现 ViewModelProvider 来编码 viewModel,如下所示:
viewModel = ViewModelProvider(this).get(GameViewModel::class.java)
但是当我 运行 应用程序时它显示 'Unresolved reference: java'。
这是我在 GameFragment 上的代码:
package com.example.android.guesstheword.screens.game
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.NavHostFragment.findNavController
import com.example.android.guesstheword.R
import com.example.android.guesstheword.databinding.GameFragmentBinding
/**
* Fragment where the game is played
*/
class GameFragment : Fragment() {
private lateinit var viewModel: GameViewModel
// The current word
private var word = ""
// The current score
private var score = 0
// The list of words - the front of the list is the next word to guess
private lateinit var wordList: MutableList<String>
private lateinit var binding: GameFragmentBinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Inflate view and obtain an instance of the binding class
binding = DataBindingUtil.inflate(
inflater,
R.layout.game_fragment,
container,
false
)
//this line generates the error. In Android Studio, 'java' is colored red
viewModel = ViewModelProvider(this).get(GameViewModel::class.java)
resetList()
nextWord()
binding.correctButton.setOnClickListener { onCorrect() }
binding.skipButton.setOnClickListener { onSkip() }
updateScoreText()
updateWordText()
return binding.root
}
/**
* Resets the list of words and randomizes the order
*/
private fun resetList() {
wordList = mutableListOf(
"queen",
"hospital",
"basketball",
"cat",
"change",
"snail",
"soup",
"calendar",
"sad",
"desk",
"guitar",
"home",
"railway",
"zebra",
"jelly",
"car",
"crow",
"trade",
"bag",
"roll",
"bubble"
)
wordList.shuffle()
}
/**
* Called when the game is finished
*/
private fun gameFinished() {
val action = GameFragmentDirections.actionGameToScore(score)
findNavController(this).navigate(action)
}
/**
* Moves to the next word in the list
*/
private fun nextWord() {
//Select and remove a word from the list
if (wordList.isEmpty()) {
gameFinished()
} else {
word = wordList.removeAt(0)
}
updateWordText()
updateScoreText()
}
/** Methods for buttons presses **/
private fun onSkip() {
score--
nextWord()
}
private fun onCorrect() {
score++
nextWord()
}
/** Methods for updating the UI **/
private fun updateWordText() {
binding.wordText.text = word
}
private fun updateScoreText() {
binding.scoreText.text = score.toString()
}
}
我的 gradle 代码(模块):
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'
apply plugin: "androidx.navigation.safeargs.kotlin"
android {
compileSdkVersion 30
defaultConfig {
applicationId "com.example.android.guesstheword"
minSdkVersion 19
targetSdkVersion 30
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
buildFeatures {
dataBinding true
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
// KTX
implementation 'androidx.core:core-ktx:1.3.1'
// Navigation
implementation "android.arch.navigation:navigation-fragment-ktx:1.0.0-rc02"
implementation "android.arch.navigation:navigation-ui-ktx:1.0.0-rc02"
// Lifecycles
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
}
还有我的其他 gradle 代码(
buildscript {
ext.kotlin_version = '1.3.72'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-rc02"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
IDE 提供了上下文操作,例如重命名引用、创建扩展 属性'KClass.java 以及将赋值转换为赋值表达式,但我不知道是什么操作选择每一项后要做的事情。
我下载了项目,一切正常。请检查分支final-solution-code并与你的代码进行比较。
我已经通过添加以下内容解决了问题:
implementation("org.jetbrains.kotlin:kotlin-reflect:1.6.0")
关于 gradle(模块)下的依赖项。 gradle 同步后,我转到文件 > 使 Caches/Restart 无效,关闭 Android Studio,转到 proj 文件夹并删除 .idea 文件夹,然后打开 Android再次工作室,再次打开项目。
作为背景,我正在开发我们教授提供的 Guess It 应用程序(入门应用程序来自 Udacity),并且我正在使用 Kotlin 创建一个 GameViewModel。我通过在 GameFragment class 的 onCreateView 上实现 ViewModelProvider 来编码 viewModel,如下所示:
viewModel = ViewModelProvider(this).get(GameViewModel::class.java)
但是当我 运行 应用程序时它显示 'Unresolved reference: java'。
这是我在 GameFragment 上的代码:
package com.example.android.guesstheword.screens.game
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.NavHostFragment.findNavController
import com.example.android.guesstheword.R
import com.example.android.guesstheword.databinding.GameFragmentBinding
/**
* Fragment where the game is played
*/
class GameFragment : Fragment() {
private lateinit var viewModel: GameViewModel
// The current word
private var word = ""
// The current score
private var score = 0
// The list of words - the front of the list is the next word to guess
private lateinit var wordList: MutableList<String>
private lateinit var binding: GameFragmentBinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Inflate view and obtain an instance of the binding class
binding = DataBindingUtil.inflate(
inflater,
R.layout.game_fragment,
container,
false
)
//this line generates the error. In Android Studio, 'java' is colored red
viewModel = ViewModelProvider(this).get(GameViewModel::class.java)
resetList()
nextWord()
binding.correctButton.setOnClickListener { onCorrect() }
binding.skipButton.setOnClickListener { onSkip() }
updateScoreText()
updateWordText()
return binding.root
}
/**
* Resets the list of words and randomizes the order
*/
private fun resetList() {
wordList = mutableListOf(
"queen",
"hospital",
"basketball",
"cat",
"change",
"snail",
"soup",
"calendar",
"sad",
"desk",
"guitar",
"home",
"railway",
"zebra",
"jelly",
"car",
"crow",
"trade",
"bag",
"roll",
"bubble"
)
wordList.shuffle()
}
/**
* Called when the game is finished
*/
private fun gameFinished() {
val action = GameFragmentDirections.actionGameToScore(score)
findNavController(this).navigate(action)
}
/**
* Moves to the next word in the list
*/
private fun nextWord() {
//Select and remove a word from the list
if (wordList.isEmpty()) {
gameFinished()
} else {
word = wordList.removeAt(0)
}
updateWordText()
updateScoreText()
}
/** Methods for buttons presses **/
private fun onSkip() {
score--
nextWord()
}
private fun onCorrect() {
score++
nextWord()
}
/** Methods for updating the UI **/
private fun updateWordText() {
binding.wordText.text = word
}
private fun updateScoreText() {
binding.scoreText.text = score.toString()
}
}
我的 gradle 代码(模块):
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'
apply plugin: "androidx.navigation.safeargs.kotlin"
android {
compileSdkVersion 30
defaultConfig {
applicationId "com.example.android.guesstheword"
minSdkVersion 19
targetSdkVersion 30
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
buildFeatures {
dataBinding true
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
// KTX
implementation 'androidx.core:core-ktx:1.3.1'
// Navigation
implementation "android.arch.navigation:navigation-fragment-ktx:1.0.0-rc02"
implementation "android.arch.navigation:navigation-ui-ktx:1.0.0-rc02"
// Lifecycles
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
}
还有我的其他 gradle 代码(
buildscript {
ext.kotlin_version = '1.3.72'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-rc02"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
IDE 提供了上下文操作,例如重命名引用、创建扩展 属性'KClass.java 以及将赋值转换为赋值表达式,但我不知道是什么操作选择每一项后要做的事情。
我下载了项目,一切正常。请检查分支final-solution-code并与你的代码进行比较。
我已经通过添加以下内容解决了问题:
implementation("org.jetbrains.kotlin:kotlin-reflect:1.6.0")
关于 gradle(模块)下的依赖项。 gradle 同步后,我转到文件 > 使 Caches/Restart 无效,关闭 Android Studio,转到 proj 文件夹并删除 .idea 文件夹,然后打开 Android再次工作室,再次打开项目。