我目前正在使用Kotlin开发我的第一个Android应用程序。在我的活动中有很多UI元素,我用它们来显示动态信息(见下面的示例(。出于性能原因,我学到了:
"在类中定义一个变量,并在onCreate((中对其进行初始化方法">
这有点混乱,我的问题是:是否有其他技术可以完成相同的任务,但代码更干净?这些变量稍后将用于其他方法。
class MainActivity : AppCompatActivity() {
private lateinit var text_1: TextView
private lateinit var text_2: TextView
private lateinit var text_3: TextView
private lateinit var text_4: TextView
[...]
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
text_1 = findViewById(R.id.text1)
text_2 = findViewById(R.id.text2)
text_3 = findViewById(R.id.text3)
text_4 = findViewById(R.id.text4)
[...]
}
来自ViewBinding官方文档:
视图绑定是一项功能,允许您更容易地编写与视图交互的代码
首先,在您的模块中启用ViewBinding:
android {
...
buildFeatures {
viewBinding true
}
}
然后,如果你从活动中调用视图,你应该:
private lateinit var binding: ResultProfileBinding
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
binding = ResultProfileBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}
然后使用绑定实例调用视图:
binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }
若您是从一个片段调用视图,您应该按照以下方式来避免泄漏:
private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = ResultProfileBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
在Kotlin中,您只需要直接使用id,而不需要绑定。该类将导入以下内容:
import kotlinx.android.synthetic.main.<your_layout_xml>.*
在这种情况下,它将import: kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
text_1.text = "Text1"
text_2.text = "Text2"
[...]
}