使用View.OnClickListener或View Binding对代码集OnClickListener进行编码,哪



我知道如何使用ViewBinding在Android Studio上获取Button视图对象。但是,我很好奇在我的Android应用程序上编写setOnclickListener代码的最佳方式。在我的例子中,我把我的Kotlin代码写如下:

class MainActivity : AppCompatActivity() {

private lateinit var binding: ActivityMainBinding

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

binding.btnCameraCTA.setOnClickListener(this::openCamera)
binding.btnHeroesCTA.setOnClickListener(this::openHeroesApp)
binding.btnMoviesCTA.setOnClickListener(this::openMoviesApp)
}

private fun openCamera(view: View?) {
val isCameraFeatureExist = checkCamera()
if (isCameraFeatureExist) {
val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivity(takePictureIntent)
} else {
Toast.makeText(view?.context, "Your device doesn't have any camera", Toast.LENGTH_SHORT).show()
}
}

private fun checkCamera(): Boolean {
return packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)
}

private fun openHeroesApp(view: View?) {
val heroesIntent = Intent(view?.context, HeroesActivity::class.java)
startActivity(heroesIntent)
}

private fun openMoviesApp(view: View?) {
val moviesIntent = Intent(view?.context, MoviesActivity::class.java)
startActivity(moviesIntent)
}
}

但是,当表达式如下时,我们也可以使用View.OnClickListener编写这些代码:

class MainActivity : AppCompatActivity(), View.OnClickListener {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

binding.btnCameraCTA.setOnClickListener(this)
binding.btnHeroesCTA.setOnClickListener(this)
binding.btnMoviesCTA.setOnClickListener(this)
}
private fun checkCamera(): Boolean {
return packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.btnCameraCTA -> {
val isCameraFeatureExist = checkCamera()
if (isCameraFeatureExist) {
val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivity(takePictureIntent)
} else {
Toast.makeText(this@MainActivity, "Your device doesn't have any camera", Toast.LENGTH_SHORT).show()
}
}
R.id.btnHeroesCTA -> {
val heroesIntent = Intent(this@MainActivity, HeroesActivity::class.java)
startActivity(heroesIntent)
}
R.id.btnMoviesCTA -> {
val moviesIntent = Intent(this@MainActivity, MoviesActivity::class.java)
startActivity(moviesIntent)
}
}
}
}

有人能告诉我哪种方式更好吗?为什么?谢谢

这两者之间没有太大区别。事实上,它们都实现了View.OnClickListener接口。在你的第一个代码中,以这个为例:

binding.btnCameraCTA.setOnClickListener(this::openCamera)

View.OnClickListener接口具有setOnClickListener方法,该方法获取v: View?作为输入并返回Unit。由于this::openCamera方法的输入和输出与setOnClickListener方法完全相同,因此可以使用它来代替实现它的对象

这意味着要根据自己的偏好和代码样式来决定使用哪一个。

我认为使用单独的函数在代码可读性方面更合适。我更喜欢第一个。此外,使用MVVM模式和双向数据绑定将降低代码的复杂性。您可能需要按顺序查看下面的链接。

祝你好运!

https://developer.android.com/jetpack/guidehttps://developer.android.com/topic/libraries/architecture/viewmodelhttps://developer.android.com/topic/libraries/data-binding/two-way

相关内容

最新更新