如何初始化和使用UI元素



我目前正在使用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"
        [...]
}

最新更新