小部件(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 } }