如何遵循Kotlin Android最佳实践,用ViewBinding动态更新控件文本?
问题:如何通过ViewBinding方式更新Android控件?
我在最新版Android Studio中创建了一个Kotlin空Activity项目,主布局仅包含一个显示“Hello, World!”的TextView,随后执行了以下操作:
- 在模块build.gradle中启用ViewBinding;
- 在MainActivity.kt中定义binding实例;
- 为TextView设置id为
txtHello,布局代码如下:
<?xml version="1.0" encoding="utf-8"?> <...> <TextView android:id="@+id/txtHello" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <...>
接着我在MainActivity.kt中编写代码尝试修改txtHello的text属性,代码如下:
package com.example.myapplication import androidx.appcompat.app.AppCompatActivity import android.os.Bundle // 新增导入 import com.example.myapplication.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 移除原 setContentView // setContentView(R.layout.activity_main) // 新增ViewBinding初始化代码 binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.txtHello.setOnClickListener { binding.txtHello.setText("lel") } } }
但出现如下错误提示:
String literal in
setTextcan not be translated. Use Android resources instead.
解决方案
这个错误并非ViewBinding的使用问题,而是违反了Android开发的资源规范:禁止硬编码字符串,必须使用字符串资源以支持多语言适配。
步骤1:添加字符串资源
在res/values/strings.xml文件中添加需要的字符串:
<string name="new_hello_text">lel</string>
步骤2:通过ViewBinding更新控件文本
有两种简洁且符合规范的写法:
binding.txtHello.setOnClickListener { // 写法1:使用setText传入资源ID binding.txtHello.setText(R.string.new_hello_text) // 写法2:Kotlin属性语法(推荐,更简洁) binding.txtHello.text = getString(R.string.new_hello_text) }
额外说明
你当前的ViewBinding初始化流程是完全正确的:通过ActivityMainBinding.inflate(layoutInflater)绑定布局,再通过setContentView(binding.root)设置布局,后续直接通过binding.控件ID调用控件的方式没问题,错误仅来自硬编码字符串的写法。
内容的提问来源于stack exchange,提问作者caveman
相关产品推荐
相关产品推荐

