作為背景,我正在開發由我們的教授提供的 Guess It App(Starter App 來自 Udacity),并且我在 Kotlin 中創建 GameViewModel。我通過在 GameFragment 類中的 onCreateView 上實作 ViewModelProvider 來編碼 viewModel ,如下所示:
viewModel = ViewModelProvider(this).get(GameViewModel::class.java)
但是當我運行該應用程式時,它顯示“未決議的參考: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 以及將賦值轉換為賦值運算式,但我不知道選擇每個操作后要執行什么操作。
uj5u.com熱心網友回復:
我下載了該專案,一切看起來都很好。請檢查分支最終解決方案代碼并將其與您擁有的進行比較。
uj5u.com熱心網友回復:
我通過添加這個解決了這個問題:
implementation("org.jetbrains.kotlin:kotlin-reflect:1.6.0")
gradle(模塊)下的依賴項。gradle 同步后,我轉到檔案 > 使快取無效/重啟,關閉 Android Studio,轉到 proj 檔案夾并洗掉 .idea 檔案夾,然后再次打開 Android Studio,再次打開專案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/385847.html
標籤:爪哇 安卓 科特林 android-fragments
