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

Rah*_*hul 4 android kotlin android-viewbinding

我有一个带有按钮的活动。在按钮上单击“我想更新文本视图中的文本”。我想用ViewBinding普通的代替findViewById

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

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

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

    binding.btnRoll.setOnClickListener {
        rollDice()
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Gab*_*los 9

你有两个选择。

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")
  }
}
Run Code Online (Sandbox Code Playgroud)

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")
  }
}

Run Code Online (Sandbox Code Playgroud)

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