问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Kotlin Android开发:最基础的ViewBinding视图绑定教程

创作时间:
作者:
@小白创作中心

Kotlin Android开发:最基础的ViewBinding视图绑定教程

引用
CSDN
1.
https://blog.csdn.net/m0_74531507/article/details/140654398

目录

  • 一.添加依赖
  • 二.在Activity中使用ViewBinding
  • 三.在Fragment中使用ViewBinding

不玩虚的,就三分钟,看完就能学会最基础的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

修改布局文件

在这只是做一个示范。在整个布局文件的最外面包一层,给控件加上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效果。

ViewBindingActivity 效果

三.在Fragment中使用ViewBinding

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

修改布局文件

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

<?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效果。

ViewBindingFragment 效果

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号