Kotlin Android 第18天,从 0 到 ML - View Binding

前言:

 在Activity 和 Fragment 只要操作 xml 的元件,在 onCreate 时就要先加一堆
 元件宣告( findViewById )再来操作,  使用 View Binding,大部份就可以
 不用 findViewById,直接用元件的 id 名称就可以了,是不是很方便呀。
  	

大纲 :

在build.gradle(app) 中宣告

android {
 ...
  buildFeatures {
     viewBinding true
  }
}

在activity 中使用 ViewBinding

class Day18Activity : AppCompatActivity() {
  private lateinit var viewModel: Day18ViewModel
  // ViewBinding 
  private lateinit var binding: ActivityDay18Binding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    //setContentView(R.layout.activity_day18)

    // ViewBinding 
    binding = ActivityDay18Binding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)

    //var dayTitle: TextView = findViewById(R.id.tvtitle)

    viewModel = ViewModelProvider(this).get(Day18ViewModel::class.java)

    viewModel.mTitle.observe(this){
        //dayTitle.text = it
       
        // ViewBinding use id name 
        binding.tvtitle.text = it
    }

    viewModel.load()

  }
}

在fragment 中使用 ViewBinding

//class Day16Fragment : Fragment(R.layout.day16_fragment) {
class Day16Fragment : Fragment() {

//ViewBinding
private var _binding: Day16FragmentBinding? = 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 = Day16FragmentBinding.inflate(inflater,container,false)
    val view = binding.root
    return view //super.onCreateView(inflater, container, savedInstanceState)
}

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


override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    // Use the 'by activityViewModels()' Kotlin property delegate
    // from the fragment-ktx artifact
    val model: Day16ViewModel by activityViewModels()

    //var textView:TextView = this.requireView().findViewById(R.id.fragmenttext)
    //textView.text = model.getArticleTitle()
    //ViewBinding use id
    binding.fragmenttext.text = model.getArticleTitle()

    println("Fragment call ViewModel get Acticle Title = "+model.getArticleTitle())
  }

}

与 findViewById 的区别

Null safety 空安全:由於视图绑定创建了对视图的直接引用,因此不存在因视图 ID 
                   无效而导致空指针异常的风险。
Type safety 类型安全:每个绑定类中的字段的类型与其在 XML 文件中引用的视图相匹配。

参考:

https://developer.android.com/topic/libraries/view-binding


<<:  GitHub Action Security - 小心 workflow 泄漏敏感资讯

>>:  Day 18 储存宝石:【Lab】S3 储存类别 & 生命周期管理 (下)

物件角色建模 Object Role Modeling

ORM (Object Relational Mapping) 是目前在做资料库应用程序中,用来定义...

20.移转 Aras PLM大小事-自制快速新增专案工作产出文件

在11sp12仍然有个问题,在代理商这边始终无法解决 因此又自行新增按钮来处理问题 1.在表单Act...

Day03 - Amazon ECS Anywhere 基础说明与建置(上)

这系列主要就是讲Amazon ECS Anywhere 所以先来看看阳春版怎麽建立出来 基础运行元件...

Flutter体验 Day 20-Provider

Provider Provider封装了 InheritedWidget 功能,提供更高效且易懂的使...

[Day 28] 利用CreateML训练的模型判断情绪(上)

经过这两篇CreateML建立机器学习模型与如何提升判断准确度的教学相信大家都学会了该如何制作Cr...