如何修复 Kotlin Android Studio 3.3 中的 "Unresolved reference " 错误
How to fix "Unresolved reference " error in Kotlin Android Studio 3.3
我是 kotlin 和 Andriod studio 的新手。我正在学习教程,一切都进行得很顺利,直到我收到大量“未解决的引用错误”
我看了其他人 post 关于这个问题,但似乎没有任何帮助,因为我仍然收到多个错误
我试过了:
- 构建 -> 清理 -> 构建 -> 重建。
- 文件 -> 使缓存无效并重新启动
- 删除。idea/libraries -> 文件 -> 与 Gradle 个文件同步项目。
这是我的版本信息
Android Studio 3.3.1 Build #AI-182.5107.16.33.5264788, built on January 28, 2019 JRE: 1.8.0_152-release-1248-b01 amd64 JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o Windows 10 10.0
我的代码
package e.lakal.tapfighter
import android.content.ContentValues.TAG
import android.os.Bundle
import android.os.CountDownTimer
import android.os.PersistableBundle
import android.support.design.widget.Snackbar
import android.support.v7.app.AppCompatActivity
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
internal lateinit var tapmeButton: Button;
internal lateinit var GameScore: TextView;
internal lateinit var Timer: TextView;
internal var Score = 0
internal var gameStarted = false
internal lateinit var countDownTimer : CountDownTimer
internal val initalCountDown: Long = 60000;
internal val CountDownInterval: Long = 1000;
internal val TAG = MainActivity::class.java.simpleName
internal val timeLeftonTimer : Long = 6000
companion object {
private val SCORE_KEY ="SCORE_KEY"
private val TIME_LEFT_KEY = "TIME_LEFT_KEY"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d(TAG, "On create called. Score is $Score")
setSupportActionBar(toolbar)
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action",
Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
tapmeButton = findViewById<Button>(R.id.tapmeButton)
GameScore = findViewById<TextView>(R.id.GameScore)
Timer = findViewById<TextView>(R.id.Timer)
GameScore.text = getString(R.string.YourScore, Score.toString())
tapmeButton.setOnClickListener{ view ->
incrementScore()
}
resetGame()
}
private fun resetGame(){
Score = 0
GameScore.text = getString(R.string.YourScore, Score.toString())
val initalTimeLeft = initalCountDown / 1000
Timer.text = getString(R.string.TimeLeft,
initalTimeLeft.toString())
countDownTimer = object: CountDownTimer(initalCountDown,
CountDownInterval) {
override fun onTick(millisUntilFinished: Long) {
val timeLeft = millisUntilFinished / 1000
Timer.text = getString(R.string.TimeLeft,
timeLeft.toString())
}
override fun onFinish() {
endGame()
}
}
gameStarted =false;
}
// Starts giving me problems here
}
private fun startGame(){
countDownTimer.start()
gameStarted
}
override fun onSaveInstanceState(outState: Bundle?,
outPersistentState: PersistableBundle?) {
super.onSaveInstanceState(outState, outPersistentState)
outState?.putInt(SCORE_KEY, Score)
outState?.putLong(TIME_LEFT_KEY, timeLeftonTimer)
countDownTimer.cancel()
Log.d(TAG,"onSaveInstanceState : Saving score : $Score & Saving
Time current $timeLeftonTimer")
}
override fun onDestroy(){
super.onDestroy()
Log.d(TAG, "onDestroy called.")
}
private fun endGame(){
Toast.makeText(this, getString(R.string.game_over_msg, Score.toString()), Toast.LENGTH_SHORT).show()
resetGame()
}
private fun incrementScore() {
if(!gameStarted){
startGame() }
Score++
val newScore = getString(R.string.YourScore, Score.toString())
GameScore.text = newScore
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_settings -> true
else -> super.onOptionsItemSelected(item)
}
}
}
Logcat
019-02-24 17:49:13.359 2003-6170/? E/WakeLock: GCM_HB_ALARM release
without a matched acquire!2019-02-24 17:49:13.450 1641-1769/?
I/WifiService: getConnectionInfo uid=10013
2019-02-24 17:49:58.235 1641-1769/? D/WificondControl: Scan result
ready event
2019-02-24 17:50:00.008 1641-1654/? E/memtrack: Couldn't load
memtrack module
2019-02-24 17:50:00.008 1641-1654/? W/android.os.Debug: failed to
get memory consumption info: -1
2019-02-24 17:50:00.016 1436-1454/? D/hwcomposer: hw_composer sent
6 syncs in 60s
2019-02-24 17:50:00.111 1443-1443/? I/boot-pipe: done populating
/dev/random
2019-02-24 17:50:15.532 1641-1658/? E/BatteryExternalStatsWorker:
modem info is invalid: ModemActivityInfo{ mTimestamp=0
mSleepTimeMs=0 mIdleTimeMs=0 mTxTimeMs[]=[0, 0, 0, 0, 0]
mRxTimeMs=0 mEnergyUsed=0}
在“// 在这里开始给我带来问题”的下方,方法的范围是文件的根目录,而不是 class.
内部
所以,我重新格式化了您的代码,我可以检查 'Unresolved reference error' 是否消失,不包括工具栏、fab 和 R。**
试一试,告诉我结果。
package e.lakal.tapfighter
import android.content.ContentValues
import android.content.ContentValues.TAG
import android.os.Bundle
import android.os.CountDownTimer
import android.os.PersistableBundle
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.appg.saltfactory.R
import com.google.android.material.snackbar.Snackbar
class MainActivity : AppCompatActivity() {
internal lateinit var tapmeButton: Button;
internal lateinit var GameScore: TextView;
internal lateinit var Timer: TextView;
internal var Score = 0
internal var gameStarted = false
internal lateinit var countDownTimer: CountDownTimer
internal val initalCountDown: Long = 60000;
internal val CountDownInterval: Long = 1000;
internal val TAG = MainActivity::class.java.simpleName
internal val timeLeftonTimer: Long = 6000
companion object {
private val SCORE_KEY = "SCORE_KEY"
private val TIME_LEFT_KEY = "TIME_LEFT_KEY"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
Log.d(TAG, "On create called. Score is $Score")
setSupportActionBar(toolbar)
fab.setOnClickListener { view ->
Snackbar.make(
view, "Replace with your own action",
Snackbar.LENGTH_LONG
)
.setAction("Action", null).show()
}
tapmeButton = findViewById<Button>(R.id.tapmeButton)
GameScore = findViewById<TextView>(R.id.GameScore)
Timer = findViewById<TextView>(R.id.Timer)
GameScore.text = getString(R.string.YourScore, Score.toString())
tapmeButton.setOnClickListener { view ->
incrementScore()
}
resetGame()
}
private fun resetGame() {
Score = 0
GameScore.text = getString(R.string.YourScore, Score.toString())
val initalTimeLeft = initalCountDown / 1000
Timer.text = getString(
R.string.TimeLeft,
initalTimeLeft.toString()
)
countDownTimer = object : CountDownTimer(
initalCountDown,
CountDownInterval
) {
override fun onTick(millisUntilFinished: Long) {
val timeLeft = millisUntilFinished / 1000
Timer.text = getString(
R.string.TimeLeft,
timeLeft.toString()
)
}
override fun onFinish() {
endGame()
}
}
gameStarted = false;
}
// Starts giving me problems here
private fun startGame() {
countDownTimer.start()
gameStarted
}
override fun onSaveInstanceState(
outState: Bundle?,
outPersistentState: PersistableBundle?
) {
super.onSaveInstanceState(outState, outPersistentState)
outState?.putInt(SCORE_KEY, Score)
outState?.putLong(TIME_LEFT_KEY, timeLeftonTimer)
countDownTimer.cancel()
Log.d(
ContentValues.TAG, "onSaveInstanceState : Saving score : $Score & Saving Time current $timeLeftonTimer")
}
override fun onDestroy() {
super.onDestroy()
Log.d(ContentValues.TAG, "onDestroy called.")
}
private fun endGame() {
Toast.makeText(this, getString(R.string.game_over_msg, Score.toString()), Toast.LENGTH_SHORT).show()
resetGame()
}
private fun incrementScore() {
if (!gameStarted) {
startGame()
}
Score++
val newScore = getString(R.string.YourScore, Score.toString())
GameScore.text = newScore
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_settings -> true
else -> super.onOptionsItemSelected(item)
}
}
}
尝试将 gradle 版本从 3.3.1 更改为 3.2.1
classpath 'com.android.tools.build:gradle:3.2.1'
设法解决了问题,显然 onSaveInstanceState() 和 onDestory() 需要移动到 onCreate 函数下
已更新
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
Log.d(TAG, "On create called. Score is $Score")
setSupportActionBar(toolbar)
fab.setOnClickListener { view ->
Snackbar.make(
view, "Replace with your own action",
Snackbar.LENGTH_LONG
)
.setAction("Action", null).show()
}
override fun onSaveInstanceState(
outState: Bundle?,
outPersistentState: PersistableBundle?
) {
super.onSaveInstanceState(outState, outPersistentState)
outState?.putInt(SCORE_KEY, Score)
outState?.putLong(TIME_LEFT_KEY, timeLeftonTimer)
countDownTimer.cancel()
Log.d(ContentValues.TAG, "onSaveInstanceState : Saving score : $Score & Saving Time current $timeLeftonTimer")
}
override fun onDestroy() {
super.onDestroy()
Log.d(ContentValues.TAG, "onDestroy called.")
}
我在如下所示的插件块中的 build.gradle(app)
中添加了 id 'kotlin-android-extensions'
,它解决了我的问题
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-android-extensions'
}
有关详细信息,请阅读 this
我是 kotlin 和 Andriod studio 的新手。我正在学习教程,一切都进行得很顺利,直到我收到大量“未解决的引用错误”
我看了其他人 post 关于这个问题,但似乎没有任何帮助,因为我仍然收到多个错误
我试过了:
- 构建 -> 清理 -> 构建 -> 重建。
- 文件 -> 使缓存无效并重新启动
- 删除。idea/libraries -> 文件 -> 与 Gradle 个文件同步项目。
这是我的版本信息
Android Studio 3.3.1 Build #AI-182.5107.16.33.5264788, built on January 28, 2019 JRE: 1.8.0_152-release-1248-b01 amd64 JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o Windows 10 10.0
我的代码
package e.lakal.tapfighter
import android.content.ContentValues.TAG
import android.os.Bundle
import android.os.CountDownTimer
import android.os.PersistableBundle
import android.support.design.widget.Snackbar
import android.support.v7.app.AppCompatActivity
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
internal lateinit var tapmeButton: Button;
internal lateinit var GameScore: TextView;
internal lateinit var Timer: TextView;
internal var Score = 0
internal var gameStarted = false
internal lateinit var countDownTimer : CountDownTimer
internal val initalCountDown: Long = 60000;
internal val CountDownInterval: Long = 1000;
internal val TAG = MainActivity::class.java.simpleName
internal val timeLeftonTimer : Long = 6000
companion object {
private val SCORE_KEY ="SCORE_KEY"
private val TIME_LEFT_KEY = "TIME_LEFT_KEY"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d(TAG, "On create called. Score is $Score")
setSupportActionBar(toolbar)
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action",
Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
tapmeButton = findViewById<Button>(R.id.tapmeButton)
GameScore = findViewById<TextView>(R.id.GameScore)
Timer = findViewById<TextView>(R.id.Timer)
GameScore.text = getString(R.string.YourScore, Score.toString())
tapmeButton.setOnClickListener{ view ->
incrementScore()
}
resetGame()
}
private fun resetGame(){
Score = 0
GameScore.text = getString(R.string.YourScore, Score.toString())
val initalTimeLeft = initalCountDown / 1000
Timer.text = getString(R.string.TimeLeft,
initalTimeLeft.toString())
countDownTimer = object: CountDownTimer(initalCountDown,
CountDownInterval) {
override fun onTick(millisUntilFinished: Long) {
val timeLeft = millisUntilFinished / 1000
Timer.text = getString(R.string.TimeLeft,
timeLeft.toString())
}
override fun onFinish() {
endGame()
}
}
gameStarted =false;
}
// Starts giving me problems here
}
private fun startGame(){
countDownTimer.start()
gameStarted
}
override fun onSaveInstanceState(outState: Bundle?,
outPersistentState: PersistableBundle?) {
super.onSaveInstanceState(outState, outPersistentState)
outState?.putInt(SCORE_KEY, Score)
outState?.putLong(TIME_LEFT_KEY, timeLeftonTimer)
countDownTimer.cancel()
Log.d(TAG,"onSaveInstanceState : Saving score : $Score & Saving
Time current $timeLeftonTimer")
}
override fun onDestroy(){
super.onDestroy()
Log.d(TAG, "onDestroy called.")
}
private fun endGame(){
Toast.makeText(this, getString(R.string.game_over_msg, Score.toString()), Toast.LENGTH_SHORT).show()
resetGame()
}
private fun incrementScore() {
if(!gameStarted){
startGame() }
Score++
val newScore = getString(R.string.YourScore, Score.toString())
GameScore.text = newScore
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_settings -> true
else -> super.onOptionsItemSelected(item)
}
}
}
Logcat
019-02-24 17:49:13.359 2003-6170/? E/WakeLock: GCM_HB_ALARM release
without a matched acquire!2019-02-24 17:49:13.450 1641-1769/?
I/WifiService: getConnectionInfo uid=10013
2019-02-24 17:49:58.235 1641-1769/? D/WificondControl: Scan result
ready event
2019-02-24 17:50:00.008 1641-1654/? E/memtrack: Couldn't load
memtrack module
2019-02-24 17:50:00.008 1641-1654/? W/android.os.Debug: failed to
get memory consumption info: -1
2019-02-24 17:50:00.016 1436-1454/? D/hwcomposer: hw_composer sent
6 syncs in 60s
2019-02-24 17:50:00.111 1443-1443/? I/boot-pipe: done populating
/dev/random
2019-02-24 17:50:15.532 1641-1658/? E/BatteryExternalStatsWorker:
modem info is invalid: ModemActivityInfo{ mTimestamp=0
mSleepTimeMs=0 mIdleTimeMs=0 mTxTimeMs[]=[0, 0, 0, 0, 0]
mRxTimeMs=0 mEnergyUsed=0}
在“// 在这里开始给我带来问题”的下方,方法的范围是文件的根目录,而不是 class.
内部所以,我重新格式化了您的代码,我可以检查 'Unresolved reference error' 是否消失,不包括工具栏、fab 和 R。**
试一试,告诉我结果。
package e.lakal.tapfighter
import android.content.ContentValues
import android.content.ContentValues.TAG
import android.os.Bundle
import android.os.CountDownTimer
import android.os.PersistableBundle
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.appg.saltfactory.R
import com.google.android.material.snackbar.Snackbar
class MainActivity : AppCompatActivity() {
internal lateinit var tapmeButton: Button;
internal lateinit var GameScore: TextView;
internal lateinit var Timer: TextView;
internal var Score = 0
internal var gameStarted = false
internal lateinit var countDownTimer: CountDownTimer
internal val initalCountDown: Long = 60000;
internal val CountDownInterval: Long = 1000;
internal val TAG = MainActivity::class.java.simpleName
internal val timeLeftonTimer: Long = 6000
companion object {
private val SCORE_KEY = "SCORE_KEY"
private val TIME_LEFT_KEY = "TIME_LEFT_KEY"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
Log.d(TAG, "On create called. Score is $Score")
setSupportActionBar(toolbar)
fab.setOnClickListener { view ->
Snackbar.make(
view, "Replace with your own action",
Snackbar.LENGTH_LONG
)
.setAction("Action", null).show()
}
tapmeButton = findViewById<Button>(R.id.tapmeButton)
GameScore = findViewById<TextView>(R.id.GameScore)
Timer = findViewById<TextView>(R.id.Timer)
GameScore.text = getString(R.string.YourScore, Score.toString())
tapmeButton.setOnClickListener { view ->
incrementScore()
}
resetGame()
}
private fun resetGame() {
Score = 0
GameScore.text = getString(R.string.YourScore, Score.toString())
val initalTimeLeft = initalCountDown / 1000
Timer.text = getString(
R.string.TimeLeft,
initalTimeLeft.toString()
)
countDownTimer = object : CountDownTimer(
initalCountDown,
CountDownInterval
) {
override fun onTick(millisUntilFinished: Long) {
val timeLeft = millisUntilFinished / 1000
Timer.text = getString(
R.string.TimeLeft,
timeLeft.toString()
)
}
override fun onFinish() {
endGame()
}
}
gameStarted = false;
}
// Starts giving me problems here
private fun startGame() {
countDownTimer.start()
gameStarted
}
override fun onSaveInstanceState(
outState: Bundle?,
outPersistentState: PersistableBundle?
) {
super.onSaveInstanceState(outState, outPersistentState)
outState?.putInt(SCORE_KEY, Score)
outState?.putLong(TIME_LEFT_KEY, timeLeftonTimer)
countDownTimer.cancel()
Log.d(
ContentValues.TAG, "onSaveInstanceState : Saving score : $Score & Saving Time current $timeLeftonTimer")
}
override fun onDestroy() {
super.onDestroy()
Log.d(ContentValues.TAG, "onDestroy called.")
}
private fun endGame() {
Toast.makeText(this, getString(R.string.game_over_msg, Score.toString()), Toast.LENGTH_SHORT).show()
resetGame()
}
private fun incrementScore() {
if (!gameStarted) {
startGame()
}
Score++
val newScore = getString(R.string.YourScore, Score.toString())
GameScore.text = newScore
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_settings -> true
else -> super.onOptionsItemSelected(item)
}
}
}
尝试将 gradle 版本从 3.3.1 更改为 3.2.1
classpath 'com.android.tools.build:gradle:3.2.1'
设法解决了问题,显然 onSaveInstanceState() 和 onDestory() 需要移动到 onCreate 函数下
已更新
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
Log.d(TAG, "On create called. Score is $Score")
setSupportActionBar(toolbar)
fab.setOnClickListener { view ->
Snackbar.make(
view, "Replace with your own action",
Snackbar.LENGTH_LONG
)
.setAction("Action", null).show()
}
override fun onSaveInstanceState(
outState: Bundle?,
outPersistentState: PersistableBundle?
) {
super.onSaveInstanceState(outState, outPersistentState)
outState?.putInt(SCORE_KEY, Score)
outState?.putLong(TIME_LEFT_KEY, timeLeftonTimer)
countDownTimer.cancel()
Log.d(ContentValues.TAG, "onSaveInstanceState : Saving score : $Score & Saving Time current $timeLeftonTimer")
}
override fun onDestroy() {
super.onDestroy()
Log.d(ContentValues.TAG, "onDestroy called.")
}
我在如下所示的插件块中的 build.gradle(app)
中添加了 id 'kotlin-android-extensions'
,它解决了我的问题
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-android-extensions'
}
有关详细信息,请阅读 this