- 让布局文件承担了部分原本属于页面的工作,使页面与布局耦合度进一步降低
应用
- 需要在build.gradle中开启DataBinding
defaultConfig {
minSdk 21
targetSdk 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
//开启
dataBinding{
enabled = true
}
}
- activity中设置
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);
activityMainBinding.setIdol(new Idol("我"));
}
}
- 然后布局里面改为databinding布局
<layout 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">
<data>
<variable
//变量名字
name="idol"
type="com.example.databinding.Idol" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="TextView"
//获取变量属性
android:text="@{idol.name}"
android:textSize="24sp"
app:layout_constraintBottom_toTopOf="@+id/guideline2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
import
布局里还可以import类
public class IdolUtils {
public static String getIdolName() {
return "name is name";
}
}
//布局文件中
<data>
<variable
name="idol"
type="com.example.databinding.Idol" />
<import type="com.example.databinding.IdolUtils"/>
</data>
//使用
android:text="@{IdolUtils.getIdolName()}"
事件绑定
- 定义事件处理类
public class EventHandleListener {
private Context context;
public EventHandleListener(Context context) {
this.context = context;
}
public void onClick(View view){
Toast.makeText(context, "哈哈哈",Toast.LENGTH_SHORT).show();
}
}
- 布局中绑定事件处理
<data>
<variable
name="idol"
type="com.example.databinding.Idol" />
<variable
name="eventHandle"
type="com.example.databinding.EventHandleListener" />
<import type="com.example.databinding.IdolUtils"/>
</data>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
android:onClick="@{eventHandle.onClick}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline2" />
- activity中设置
activityMainBinding.setEventHandle(new EventHandleListener(this));
二级页面的绑定
- 二级页面中也要是binding
- 然后用app命名空间传给二级页面
//主页面
<include layout="@layout/sub"
app:idol="@{idol}"/>
//子页面
<layout 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">
<data>
<variable
name="idol"
type="com.example.databinding.Idol" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{idol.name}"
android:textSize="24sp"
app:layout_constraintBottom_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="TextView" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
用BaseObservable双向绑定
- 需要继承BaseObservable
public class UserViewModel extends BaseObservable {
private User user;
public UserViewModel() {
this.user = new User("name");
}
@Bindable
public String getUserName() {
return user.getName();
}
public void setUserName(String userName){
if (userName != null && userName.equals(user.name)){
user.name = userName;
notifyPropertyChanged(BR.userName);
}
}
}
- 布局里使用也有点变化
//导入数据这里没有变
<data>
<variable
name="userViewModel"
type="com.example.databinding2.UserViewModel" />
</data>
<EditText
android:id="@+id/editTextTextPersonName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
//主要是这里变化,多了一个=号
android:text="@={userViewModel.userName}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
- activity里设置
ActivityMainBinding viewDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
viewDataBinding.setUserViewModel(new UserViewModel());
用ObservableField进行双向绑定,这个更加简洁
主要是ViewModel里要修改下
public class UserViewModel2 {
private ObservableField<User> observableField;
private User user;
public UserViewModel2() {
this.user = new User("name");
observableField = new ObservableField<>();
observableField.set(user);
}
public String getUserName() {
return observableField.get().name;
}
public void setUserName(String userName){
if (userName != null && userName.equals(user.name)){
observableField.get().setName(userName);
}
}
}
布局和activity里都一样
坑
ActivityMainBinding找不到
- 布局必须是binding layout
怎样高效学习Kotlin?
规划学习路径:根据目标制定学习计划,可以参考已有的学习资源目录,如“Android Kotlin入门到进阶”教程,按照其章节顺序进行系统学习。
理论学习:通过官方文档、教程书籍、在线课程、博客文章等资源,理解Kotlin语言特性、Android SDK组件、设计模式、架构理念等基础知识。
重点学习内容:
• Kotlin基础:掌握变量声明、数据类型、控制流、函数、类与对象、接口与继承、泛型等核心概念。
• Android基础知识:理解Activity/Fragment生命周期、UI布局(XML)、资源管理、Intent系统、数据存储等。
• Kotlin在Android中的特有应用:如扩展函数、属性委托、密封类、协程、Anko库(如果还在使用)或Jetpack组件(如ViewModel、LiveData、Room等)。
Kotlin作为一种现代的、静态类型的编程语言,拥有诸多独特且强大的特性,虽然Kotlin语法简洁,但是想要深入理解他的新特性,熟练的使用在工作上面还是得要花费很大的时间成本来学习,因此我给大家准备了Kotlin从入门到精通和高级Kotlin强化实战两份资料来帮助大家系统的学习Kotlin,需要的朋友扫描下方二维码,免费领取!!!
Kotlin从入门到精通
准备开始
- 基本语法
- 习惯用语
- 编码风格
基础
- 基本类型
- 包
- 控制流
- 返回与跳转
类和对象
- 类和继承
- 属性和字段
- 接口
- 可见性修饰词
- 扩展
- 数据对象
- …
函数和lambda表达式
- 函数
- 高级函数和lambda表达式
- 内联函数
其他
- 多重申明
- Ranges
- 类型检查和自动转换
- This表达式
- 等式
- 运算符重载
- …
互用性
- 动态类型
工具
- Kotlin代码文档
- 使用Maven
- 使用Ant
- 使用Griffon
- 使用Gradle
FAQ
- 与Java对比
- 与Scala对比
高级Kotlin强化实战
第一章 Kotlin入门教程
- 1.Kotlin概述
- 2.Kotlin与Java比较
- 3.巧用Android Studio
- 4.认识Kotlin基本类型
- 5.走进Kotlin的数组
- 6.走进Kotlin的集合
- 7.集合问题
- 8.完整代码
- 9.基础语法
第二章 Kotlin实战避坑指南
- 2.1 方法入参是常量,不可修改
- 2.2 不要 Companion 、INSTANCE ?
- 2.3 Java 重载,在 Kotlin 中怎么巧妙过渡一下?
- 2.4 Kotlin 中的判空姿势
- 2.5 Kotlin 复写 Java 父类中的方法
- 2.6 Kotlin “狠”起来,连TODO 都不放过!
- …
第三章 项目实战《Kotlin Jetpack实战》
- 3.1 从一个膜拜大神的 Demo 开始
- 3.2 Kotlin 写 Gradle 脚本是一种什么体验?
- 3.3 Kotlin 编程的三重境界
- 3.4 Kotlin 高阶函数
- 3.5 Kotlin泛型
- 3.6 Kotlin 扩展
- 3.7 Kotlin 委托
- 3.8 协程“不为人知”的调试技巧
- 3.9 图解协程:suspend