You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遵循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 setText can 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 05:15:32