Android 在 onCreate 之外访问视图绑定 val activity

Android access view binding val outside onCreate activity

我有一个带有按钮的 activity。在按钮上单击我想更新文本视图中的文本。 我想使用 ViewBinding 而不是正常的 findViewById

这就是我创建 val 绑定的方式

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val binding = ActivityMainBinding.inflate(layoutInflater);
    setContentView(binding.root)

    binding.btnRoll.setOnClickListener {
        rollDice()
    }
}

现在 rollDice 我想更新文本视图,但我无法访问有意义的绑定,因为它的范围仅限于 onCreate(),那么最佳实践是什么这个?

  private fun rollDice() {
       val random = Random().nextInt(6) + 1
       binding.txt_random.setText("random")
    }

将绑定存储在 Activity 上的实例变量中。然后您可以从 Activity.

中的所有方法访问它

你有两个选择。

1。存储在 属性

由于 Activity 的膨胀内容完全绑定到它的生命周期,将引用保留为 属性

是安全的
class MainActivity : AppCompatActivity() {
  lateinit var binding: ActivityMainBinding

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    binding = ActivityMainBinding.inflate(layoutInflater);
    setContentView(binding.root)

    binding.btnRoll.setOnClickListener {
      rollDice()
    }
  }

  private fun rollDice() {
    val random = Random().nextInt(6) + 1
    binding.txt_random.setText("random")
  }
}

2。将绑定传递给方法

这就是我通常做的事情,它避免了创建一个 属性 并不是真正必要的

class MainActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    val binding = ActivityMainBinding.inflate(layoutInflater);
    setContentView(binding.root)

    binding.btnRoll.setOnClickListener {
      rollDice(binding)
    }
  }

  private fun rollDice(binding: ActivityMainBinding) {
    val random = Random().nextInt(6) + 1
    binding.txt_random.setText("random")
  }
}

这两个选项都是使绑定对活动方法可见的有效方法。

由于问题已接受答案并且已经得到解决,但这是我对 viewBinding 的处理方法

    class MainActivity : AppCompatActivity() {
      private val binding by lazy{
         ActivityMainBinding.inflate(layoutInflater)
       }  
    
      override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
    
        binding.btnRoll.setOnClickListener {
          rollDice()
        }
      }
    
      private fun rollDice() {
        val random = Random().nextInt(6) + 1
        binding.txt_random.setText("random")
      }
    }

我使用绑定的惰性初始化,这样它只在需要时才初始化。 您可以在此处阅读有关延迟初始化的更多信息 https://www.baeldung.com/kotlin/lazy-initialization