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
我有一个带有按钮的 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