小部件(TextView)中的UNRESOLVED_REFERENCE已解析为android-kotlin中的错误元素

如何更新kotlin中Textview的文本。 设置文本创建功能的作品,但是当我在主要乐趣之外尝试它说未解决的参考。

我怎样才能声明小部件重用TextView更新文本值? 我没有kotlin exp。 有人可以帮我吗?

class MediaPickedActivity : AppCompatActivity() { val fullName = "Test User" var score = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_media_picked) val Tv_test = findViewById(R.id.tv_text) as TextView Tv_test.setText("$fullName :: $score ") if (score in 0..300) { score = 5 setText() } } private fun setText() { // Error is here. I can't set text. Tv_test.setText("$fullName :: $score ") } } 

在这里输入图像描述

您应该将View声明为类级属性,然后您可以从类中的任何位置访问它们。 在函数内声明的变量只能在该函数中访问。

 class MediaPickedActivity : AppCompatActivity() { lateinit var Tv_test: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_media_picked) Tv_test = findViewById(R.id.tv_text) as TextView } private fun setText() { Tv_test.setText("$fullName :: $score ") } } 

在这个例子中我使用了lateinit ,但是在这里可以看到关于声明属性的不同方法的详细讨论。

除了@ zsmb13说的外,你还可以使用Kotlin的Android扩展插件(因为你把它作为主题之一),这对于最大限度地减少潜在的findViewById()错误,除了使用视图字段/成员变量,等等如下:

首先在你本地的build.gradle文件中应用这个插件:

apply plugin: 'kotlin-android-extensions'

接下来,在Activity类中导入特定布局的小部件属性:

import kotlinx.android.synthetic.main.<layout>.*

…然后您的活动将如下所示:

 import kotlinx.android.synthetic.main.activity_media_picked.* class MediaPickedActivity : AppCompatActivity() { val fullName = "Test User" var score = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_media_picked) // Simply references via the TextView's ID, and sets its text. tv_text.setText("$fullName :: $score ") if (score in 0..300) { score = 5 setText() } } private fun setText() { tv_text.setText("$fullName :: $score ") } } 

你也可以使用一个懒的属性 ,它将在需要时初始化属性,并从逻辑中分离初始化,例如:

 class MediaPickedActivity : AppCompatActivity() { val Tv_test by lazy { findViewById(R.id.tv_text) as TextView } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_media_picked) Tv_test.setText("$fullName :: $score ") // ... } private fun setText() { Tv_test.setText("$fullName :: $score ") } } 

或者使用特定类型参数 T编写内联函数,以使代码更具可读性。

 class MediaPickedActivity : AppCompatActivity() { val nonNull by find<TextView>(R.id.tv_text) val nullable by find<TextView?>(R.id.tv_text) // ... } inline fun <reified T : View?> Activity.find(id: Int): Lazy<T> { return lazy { findViewById(id) as T } }