iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0
Mobile Development

【Kotlin Notes And JetPack】Build an App系列 第 18

Day 18.【Architecture】ViewBinding 的介紹與應用

  • 分享至 

  • xImage
  •  

要如何在 Fragment 或是 Activity 中取得元件並將資料呈現上去呢?透過 ViewBinding 可以輕鬆操作元件,程式碼也會變得更簡潔,我們就來看看什麼是 ViewBinding 吧!以下如有解釋不清或是描述錯誤的地方還請大家多多指教:

什麼?

| Method

除了 ViewBinding 之外還有哪些方式可以取得 view 的元件呢?

  • findViewById
lateinit var cityTitle: TextView
cityTitle = findViewById(R.id.cityTitle)
cityTitle.text = "London" 
  • butterknife
@BindView(R.id.cityTitle)
lateinit var cityTitle: TextView
...
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(this, R.layout.activity_main)
    ButterKnife.bind(this)
}
  • Kotlin Android Extensions
// get id name
cityTitle.text = "London"

但目前 Kotlin Android Extensions 要被棄用了,官方建議改用 ViewBinding,如果本身有在使用 Parcelize 的人,改 import kotlin-parcelize plugin

  • ViewBinding
// get id name
binding.cityTitle.text = "Lodon"

| Difference Between findViewById

除了寫法較簡潔之外有以下兩個特點:

  • Null safety
    在 enable ViewBinding 後會產出一份對應 XML 的 binding file,file 中 view 會有對應的 reference,不會因為 findViewById 時找到無效 id 而導致 null point exception,每個 referanece 再產生時都會被 mark @Nullable
  • Type safety
    產生的欄位也會和 XML 對應元件的 type,避免發生 cast exception.

如何?

| Set up

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

| Start up

接下來要將 Activity 和 Fragment 做 binding 的動作

  • Activity
class MainActivity : AppCompatActivity() {
    private lateinit var binding : ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
    }
}
  • HomeFragment
class HomeFragment : Fragment() {
    private var _binding : FragmentHomeBinding ? = null
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentHomeBinding.inflate(inflater, container, false)
        return binding.root
    }

		override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        setupView()
    }
    
    private fun setupView() = binding.apply { 
        // get view set view
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

Reference

ViewBinding


上一篇
Day 17.【Architecture】Lifecycle 的介紹與應用
下一篇
Day 19.【Architecture】Navigation 的介紹與應用
系列文
【Kotlin Notes And JetPack】Build an App30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言