首页 > 其他分享 >kotlin,Android教你最基础的ViewBinding视图绑定

kotlin,Android教你最基础的ViewBinding视图绑定

时间:2024-07-24 16:58:17浏览次数:10  
标签:控件 kotlin 绑定 binding savedInstanceState 视图 ViewBinding

目录

一.添加依赖

二.在Activity中使用ViewBinding

修改布局文件

修改kt文件

 效果

三.在 Fragment中使用 ViewBinding

修改布局文件

修改kt文件

效果

不玩虚的,就三分钟,看完就能学会最基础的ViewBinding如何使用

使用ViewBinding有什么好处呢

与使用 findViewById 相比,视图绑定具有一些很显著的优点:

1.Null 安全
由于视图绑定会创建对视图的直接引用,因此不存在因视图ID无效而引发Null指针异常的风险。此外,如果视图仅出现在布局的某些配置中,则绑定类中包含其引用的字段会使用@Nullable标记。
2.类型安全
每个绑定类中的字段均具有与它们在XML文件中引用的视图相匹配的类型。这意味着不存在发生类转换异常的风险。

相信这两点大家使用 findViewById时是很有感觉的,但是使用视图绑定就不会有这样的问题


一.添加依赖

在模块的build.gradle中添加下面这一串,就是app文件下的build.gradle,不要添加错地方了

直接把 viewBinding和 dataBinding都添加了,省的以后要加麻烦

 //视图绑定添加
    buildFeatures {
        viewBinding = true
        dataBinding = true
    }

按照这张图里面的三个步骤来

在加入上述配置后Android Studio会自动为每一个布局文件都生成一个对应的Binding类。

比如ActivityMainBinding 或者 FragmentMainBinding 都是叫xxxBinding

二.在Activity中使用ViewBinding

修改布局文件

在这只是做一个示范

在整个布局文件的最外面包一层<layout>

给控件加上id

<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/viewbinding"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="使用视图绑定!"
        android:textSize="40sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

修改kt文件

不使用视图绑定时,是这样子的,想要拿到每一个控件都要 findViewById一次,很麻烦

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

把代码修改成这样就完成了视图绑定

class MainActivity : AppCompatActivity() {
    var binding:ActivityMainBinding ?= null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding?.root
        setContentView(view)
    }
}

这样写完要拿到控件就很方便了

class MainActivity : AppCompatActivity() {
    var binding:ActivityMainBinding ?= null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding?.root
        setContentView(view)

        //拿到控件,点击事件
        binding?.viewbinding?.setOnClickListener(){
            Toast.makeText(this@MainActivity,"这是视图绑定",Toast.LENGTH_LONG).show()
        }
    }
}

 

 效果

通过视图绑定拿到了控件,并实现点击弹出Toast效果

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="i0wDbsND-1721788507938" src="https://live.csdn.net/v/embed/411934"></iframe>

ViewBindingaActivity 效果

三.在 Fragment中使用 ViewBinding

在fragment中使用视图绑定,我就在以在使用Bottomnavigation的基础上进行修改。还不会navigation的小伙伴可以去看一下我之前发布的关于Bottomnavigation的文章。

修改布局文件

写布局文件其实和Activity是一样的,要用的控件加上id,在外面包一层<layout>

<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.appcompat.widget.LinearLayoutCompat
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    tools:context=".fragment.FragmentA">
    <TextView
        android:id="@+id/aaa"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="FragmentA"
        android:textSize="30sp"/>
</androidx.appcompat.widget.LinearLayoutCompat>
</layout>

修改kt文件

最开始的fragment是这样的

class FragmentA : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_a, container, false)
    }
}

修改成这样就完成了视图绑定 

class FragmentA : Fragment() {
    var binding:FragmentABinding ?= null
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentABinding.inflate(inflater,container,false)
        
        return binding?.root
    }
}

 然后就可以用视图绑定写点击事件 

class FragmentA : Fragment() {
    var binding:FragmentABinding ?= null
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentABinding.inflate(inflater,container,false)
        //视图绑定拿到控件,点击事件
        binding?.aaa?.setOnClickListener(){
            Toast.makeText(requireContext(),"这是视图绑定",Toast.LENGTH_LONG).show()
        }
        return binding?.root
    }
}

 

效果

通过视图绑定拿到控件,实现点击后Toast效果

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="Mzj1zrnf-1721788766938" src="https://live.csdn.net/v/embed/411948"></iframe>

ViewBindingFragment 效果

标签:控件,kotlin,绑定,binding,savedInstanceState,视图,ViewBinding
From: https://blog.csdn.net/m0_74531507/article/details/140654398

相关文章

  • Django视图与URLs路由详解
            在DjangoWeb框架中,视图(Views)和URLs路由(URLrouting)是Web应用开发的核心概念。它们共同负责将用户的请求映射到相应的Python函数,并返回适当的响应。本篇博客将深入探讨Django的视图和URLs路由系统,提供实际的代码示例和操作指导,确保读者能够具体而实际地了解如......
  • 12 B端产品常用视图
    原型图        是产品经理最熟悉,也是最常用的,是产品表现层面的Demo,描绘产品的界面长什么样,功能如何设计、摆放,有哪些内容。结构图        展示产品的基本结构、框架,它能清晰展示产品有哪些模块、功能或系统组成。用例图        站在用户的叫做......
  • 为什么将小部件添加到滚动视图在 python kivy 中不起作用
    Python文件fromkivymd.appimportMDAppfromkivy.langimportBuilderfromkivy.uix.floatlayoutimportFloatLayoutfromkivy.core.windowimportWindowfromkivy.configimportConfigfromkivymd.uix.listimportOneLineListItem#UkuranwindowConfig.set(&......
  • 24.07.21 周总结(Kotlin学习)
    本周Kotlin学习学习内容以及笔记部分展示部分练习代码展示funmain(){varstu1=Student("xiaoming",13)varstu2=Student("xiaohong",15)println((stu1<stu2))}classStudent(varname:String,varage:Int){operatorfuncompareTo(......
  • 达梦数据库的系统视图v$dmwatcher
    达梦数据库的系统视图v$dmwatcher查询当前登录实例所对应的守护进程信息,注意一个守护进程可以同时守护多个组的实例,因此查询结果中部分字段(N_GROUP、SWITCH_COUNT)为守护进程的全局信息,并不是当前登录实例自身的守护信息。在DMDSC集群环境中,只显示控制守护进程的信息。另......
  • SQL Server中的定制视野:实现数据库的自定义视图
    SQLServer中的定制视野:实现数据库的自定义视图在SQLServer的数据处理和分析中,视图(View)是一种虚拟的表,其内容由SQL查询定义。自定义视图允许用户根据需要创建个性化的数据展示,可以简化复杂的查询,同时提供数据的逻辑封装和安全性控制。本文将详细介绍如何在SQLServer中实......
  • Android开发 - inflate方法与创建视图解析
    简介在Android开发过程中,很多地方都不可避免的使用到inflate方法,如在给Fragment进行CreateView(创建视图)时,我们通常是inflater.inflate(R.layout.xxx,container,false)来调用inflate方法的,不难发现,inflate方法的作用是将一个xml布局文件变成一个view对象。注意事项......
  • Oracle数据库 oracle八大性能视图
    V$SYSSTATVSYSSTAT......
  • uni-app的checkbox组件有些情况下视图层不更新解决方案
    应用场景问题:在使用uniapp的复选框组件checkbox实现列表的全选跟不全选功能时发现,列表的checkbox视图层在某些情况下不生效    解决方法 解决方案1:利用  this.$set改变数据,即 this.$set(item,'checked',false),这个时候视图层跟数据都一起更新了,但是在上面那种......
  • 达梦数据库的系统视图v$rapply_sys
    达梦数据库的系统视图v$rapply_sys在达梦数据库(DMDatabase)中,V$RAPPLY_SYS是一个系统视图,用于显示数据库的实时应用(Real-timeApply)系统信息。实时应用是一种数据库复制技术,允许将一个数据库的更改实时应用到另一个数据库中,通常用于数据同步、数据分发和灾难恢复等场景。......