文档章节

使用LiveData和DataBinding进行双向绑定

t
 tommwq
发布于 05/24 10:20
字数 306
阅读 83
收藏 0

使用LiveData和DataBinding进行双向绑定

1 引入依赖包

dependencies {
    // ...
    implementation "androidx.fragment:fragment:1.0.0"
    implementation "androidx.lifecycle:lifecycle-viewmodel:2.0.0"
    implementation "androidx.lifecycle:lifecycle-extensions:2.0.0"
}

2 开启数据绑定

android {
    dataBinding {
        enabled = true
    }
}

3 建立模型

class AuthenticationInformation(val username: String = "", val encryptedPassword: String = "")

4 建立视图模型

class AuthenticationViewModel() : ViewModel() {

    var authenticationInformation = MutableLiveData<AuthenticationInformation>()

    var username = "Alan"
    set(value) {
        field = value
        authenticationInformation.postValue(AuthenticationInformation(username, encryptPassword(password)))
    }

    var password = ""
    set(value) {
        field = value
        authenticationInformation.postValue(AuthenticationInformation(username, encryptPassword(password)))
    }

    private fun encryptPassword(originalPassword: String): String {
        // ...
        return "******"
    }
}

5 更新布局

<?xml version="1.0" encoding="utf-8"?>
<layout>
    <data>
        <variable name="authenticationViewModel" type="com.tq.livedatabinding.AuthenticationViewModel"/>
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MainActivity">

        <EditText
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@={authenticationViewModel.content}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>


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

6 在Activity中建立绑定关系

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        var binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.authenticationViewModel = ViewModelProviders.of(this).get(AuthenticationViewModel::class.java)
        binding.lifecycleOwner = this
        binding.getAuthenticationViewModel()?.authenticationInformation?.observe(this, object: Observer<AuthenticationInformation>{
            override fun onChanged(authenticationInformation: AuthenticationInformation) {
                Log.d("TEST", authenticationInformation.username)
            }
        })
    }
}

7 在Fragment中建立绑定关系

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
): View? {
    var binding = ActivityMainBinding.inflate(inflater, container, false)

    binding.authenticationViewModel = ViewModelProviders.of(activity)
            .get(AuthenticationViewModel::class.java)
    binding.lifecycleOwner = activity
    binding.getAuthenticationViewModel()?
            .authenticationInformation?
            .observe(this, object: Observer<AuthenticationInformation> {
                override fun onChanged(authenticationInformation: AuthenticationInformation) {
                    Log.d("TEST", authenticationInformation.username)
                }
            })

    return binding.root
}

© 著作权归作者所有

t

tommwq

粉丝 2
博文 24
码字总数 19636
作品 0
广州
私信 提问
Android开发利器之Data Binding Compiler V2 —— 搭建Android MVVM完全体的基础

原创声明: 该文章为原创文章,未经博主同意严禁转载。 前言: Android常用的架构有:MVC、MVP、MVVM,而MVVM是唯一一个官方提供支持组件的架构,我们可以通过Android lifecycle系列组件、D...

tangpj
2018/10/20
0
0
关于Android MvvM的一些体会

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zly921112/article/details/82849549 前言 由于我司项目较老有很多历史包袱代码结构也比较混乱,需求复杂的页...

zhuliyuan丶
2018/09/26
0
0
Architecture Components MVVM架构演进

在对MVP的架构实践中,发现写单元测试不是那么方便,因为Presenter持有了View的引用,而Mock View的 行为和方法特别的卡慢,因此只能把具体的业务逻辑再抽成一个个独立于Presenter的Logic,进...

Mr云台
2017/11/27
0
0
使用Kotlin构建MVVM应用程序—第五部分:LiveData

目录 使用Kotlin构建MVVM应用程序—总览篇 使用Kotlin构建MVVM应用程序—第一部分:入门篇 使用Kotlin构建MVVM应用程序—第二部分:Retrofit及RxJava 使用Kotlin构建MVVM应用程序—第三部分:...

ditclear
2018/08/03
0
0
MVVM项目实战之路-搭建一个登录界面

最近有一个新任务,给公司内部开发一个App,需求初始很简单,刚好之前一直在看MVVM这种开发模式,所以决定用Data Binding Library以及ViewModel等实现这种模式,因为代码和之前写法确实有很大...

山水相逢z
2017/12/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

IT兄弟连 Java语法教程 流程控制语句 循环结构语句3

while循环 Java中的另外一种循环是while循环。while循环的语法格式如下: while(条件表达式){ 循环体; } 其中条件表达式定义了控制循环的条件,可以使任何有效的boolean表达式,条件为真时,...

老码农的一亩三分地
8分钟前
0
0
OSChina 周四乱弹 —— 你们倒是救驾啊,别笑啦

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @RISYOII :#今日歌曲推荐# 一荤一素 太年轻的人 他总是不满足 固执地不愿停下 远行的脚步 望着高高的天 走了长长的路 忘了回头看 她有没有哭...

小小编辑
今天
826
10
idea下springboot 项目在static目录下添加文件不生效

idea下springboot 项目在static目录下添加文件不生效 问题描述 是这样子的,我的项目目录结构如下: 我在static目录下,创建了index.html和aaaa.jpg这两个文件。然后,启动服务访问 http://l...

wotrd
昨天
5
0
k8s1.14 一、环境

1. 4台虚拟机 (CentOS Linux release 7.2.1511 (Core) ) 192.168.130.211 master 192.168.130.212 node1 192.168.130.213 node2 192.168.130.214 node3 2. 设置服务器hostname 2.1 设置本机......

ThomasCheng
昨天
4
0
盖茨:如果我现在开创一家公司 将会专注于AI

新浪科技讯,北京时间 6 月 26 日凌晨消息,微软联合创始人比尔·盖茨(Bill Gates)在周一接受采访时表示,如果他今天从哈佛大学辍学并开创一家新公司,那么这家公司将会专注于人工智能(A...

linuxCool
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部