简介

使用的技术是观察者与被观察者的模式,在google推荐的案例中也有使用到,现在我把它封装成一个扩展函数,使得使用更加简单明了

注意

1、在build.gradle添加databinding,在android{}节点添加

dataBinding {enabled true        }

或者(一般用下面的) :

buildFeatures {dataBinding = trueviewBinding true}

2、在activity里绑定binding

在fragment里绑定binding: _binding = FragmentReturnMainBinding.inflate(inflater, container, false)

1、TextView显示的值随activity的属性值改变同时改变–LiveData

代码

MainActivity

class MainActivity : AppCompatActivity() {private val mutableLiveData = MutableLiveData<String>()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)tv2.bindValue(mutableLiveData,this)bt1.setOnClickListener {//            第二种使用扩展函数封装好的模式mutableLiveData.value="我爱李曼娜"}}/*** TextView的扩展函数* 使用方法:* val mutableLiveData = MutableLiveData<String>()* tv2.bindValue(mutableLiveData,this)** 在按钮事件里调用:mutableLiveData.value="我爱你"* TextView中显示的值就会跟着改变*/fun TextView.bindValue( mutableLiveData:MutableLiveData<String>,lifecycleOwner:LifecycleOwner){var text1: LiveData<String> = Transformations.map(mutableLiveData) {//            "观察者: $it"it}text1.observe(lifecycleOwner, Observer<String> {this.text = it})}}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"><TextViewandroid:id="@+id/tv2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!" /><Buttonandroid:id="@+id/bt1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="赋值3"/></LinearLayout></androidx.constraintlayout.widget.ConstraintLayout>

2、xml使用layout–data方式双向绑定

功能:点击按钮按钮换背景颜色,字体换颜色,textview换内容,效果图:

代码:

public class User {private String status;private String hint;private boolean isOnline;public User(String status, String hint, boolean isOnline) {this.status = status;this.hint = hint;this.isOnline = isOnline;}public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}public String getHint() {return hint;}public void setHint(String hint) {this.hint = hint;}public boolean getIsOnline() {return isOnline;}public void setIsOnline(boolean isOnline) {this.isOnline = isOnline;}
}

MainActivity :

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import android.os.Bundle;
import android.view.View;import com.example.databinding.databinding.ActivityMainBinding;public class MainActivity extends AppCompatActivity {ActivityMainBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = DataBindingUtil.setContentView(this, R.layout.activity_main);User user = new User("已下线", "快开启一天的旅程吧!!", false);binding.setUser(user);}public void switchStatus(View view) {User user = new User("已上线", "祝您旅途愉快,谢谢!!", true);binding.setUser(user);}
}
<?xml version="1.0" encoding="utf-8"?>
<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><variablename="user"type="com.example.databinding.User" /></data><androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/tvStatus"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.status}"app:layout_constraintBottom_toTopOf="@+id/tvHint"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/tvHint"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.hint}"app:layout_constraintBottom_toTopOf="@+id/button"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@+id/tvStatus" /><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@{user.isOnline?@drawable/btn_shape:@drawable/btn_shape_press}"android:onClick="switchStatus"android:text="状态切换"android:textColor="@{user.isOnline?@color/purple_200:@color/teal_200}"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/tvHint" /><!--        android:background="@{user.isOnline?@color/purple_200:@color/teal_200}"--></androidx.constraintlayout.widget.ConstraintLayout>
</layout>

btn_shape.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><corners android:radius="10dp" /><solid android:color="#2196F3" />
</shape>

btn_shape_press.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><corners android:radius="10dp" /><solid android:color="#FF018786" />
</shape>

主题:<style name="Theme.Databinding" parent="Theme.MaterialComponents.DayNight.NoActionBar.Bridge">

下载地址:https://download.csdn.net/download/wy313622821/33937925

注意:
1.ActivityMainBinding 这里的命名需要与xml的名称对应

3、MVVM双向绑定(过滤器)

<?xml version="1.0" encoding="utf-8"?>
<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><variablename="viewModel"type="com.abtalk.databinding.MainViewModel" /></data><androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{viewModel.age+`:字符串:`}"android:visibility="@{viewModel.visibility}"            app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><!--android:visibility="@{viewModel.visibility}"  这里比较复杂的逻辑运算放到mainactivity代码里写--><TextViewandroid:id="@+id/tv11"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{(viewModel.age>13)?@string/cnr:@string/w_cnr}"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="change"android:text="改变"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/textView" /></androidx.constraintlayout.widget.ConstraintLayout>
</layout>

activity代码

class MainActivity : AppCompatActivity() {private lateinit var mainViewModel: MainViewModelprivate lateinit var databindng: ActivityMainBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)databindng = DataBindingUtil.setContentView(this, R.layout.activity_main)mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)databindng.viewModel = mainViewModel}fun change(view: View) {mainViewModel.age.set(15)}
}

MainViewModel

class MainViewModel : ViewModel() {val age = ObservableInt(1)val visibility = object : ObservableInt(age) {override fun get(): Int {Log.e("wang", "===>")return if (age.get() > 13)View.GONEelseView.VISIBLE}}}

注意:上面的visibility如果没有在xml里面绑定的话,是不会触发输出的(Log.e(“wang”, “===>”))

String.xml

<resources><string name="app_name">Databinding</string><string name="cnr">成年人</string><string name="w_cnr">未成年人</string>
</resources>

完整的代码地址:https://download.csdn.net/download/wy313622821/86905039

4、dataBinding中TextView中字符串的拼接处理

第一种:

android:text="@{ `字符串:` + str}"/>

第二种:
android:text=‘@{@string/user_name+bean.name}’
这里的引号需要使用单引号

5、监听某个值的改变,并做一些其他的操作

某个值为:
var aa: ObservableField = ObservableField(0)

监听:

 aa.addOnPropertyChangedCallback(object : OnPropertyChangedCallback() {override fun onPropertyChanged(observable: Observable?, i: Int) {Log.e("wang","===>"+i)}})

让这个值改变
aa.set(10)
这样就会触发上面的回调接口

6、绑定点击事件

第一步,activity中把xml里的viewmodel跟activity的viewmodel实例进行绑定

private val returnListViewModel by viewModels<ReturnListViewModel>()//在oncreat中
binding.viewModel = returnListViewModel// xml代码中<variablename="viewModel"type="***.medicine.module_return.returned.viewmodel.ReturnListViewModel" />

第二步,带参数的点击:@{() -> viewModel.click(1)}

//xml:
android:onClick="@{() -> viewModel.click(1)}"
//ViewModel:
public void click(num:Int){}

课外知识:可以把xml里的frag跟activity的this实例进行绑定,把绑定点击事件放在fragment里

// xml代码中<variablename="frag"type="***.medicine.module_return.returned.viewmodel.Fragment" />
// fragment代码中
binding.frag = this

双向绑定的显示隐藏需要用到View:

就可以使用View.Gone

7、高级用法

android:text='@{username??"null"}'

如果表达式username为null时,则显示“null”, 不为空显示username的值

<data><!--使用Java某些类都要通过import导入才能正常使用--><import type="android.text.TextUtils" alias="textUtlis" />
</data>
<androidx.appcompat.widget.AppCompatButtonandroid:id="@+id/bt_login"android:layout_width="match_parent"android:layout_height="wrap_content"android:enabled="@{!textUtlis.isEmpty(username)?!textUtlis.isEmpty(password)?true:false:false}"android:onClick='@{v->loginModel.login(username ?? "",password ?? "",v) }'android:text="登陆" />

使用 && 进行多条件判断
我们都希望可以在databinding layout表达式中直接使用&& 逻辑判断,但遗憾会报错!这里可以使用&的转义字符 & 替代,则上面的用户名密码判空操作可以直接写成

android:enabled="@{!TextUtlis.isEmpty(username) &amp; &amp;  !TextUtlis.isEmpty(password)}"

android——databinding中字符串的拼接处理、TextView显示的值随activity的属性值改变同时改变--LiveData、双向绑定过滤器、监听某个值的改变相关推荐

  1. Xquery编辑中字符串的拼接

    Xquery编辑中字符串的拼接 学OSB以来,对于消息管道中的Xquery的使用一直停留在能看懂但是不会写的程度,导致这种现象的原因就是我一直搞不明白这种在Xquery中的字符串的拼接规则.最近终于花 ...

  2. Android通过使用系统广播监听网络状态的改变

    Android通过使用广播监听网络状态的改变 得先添加权限 //查看网络状态<uses-permission android:name="android.permission.ACCE ...

  3. html中单选按钮设置监听事件,浅谈监听单选框radio改变事件(和layui中单选按钮改变事件),单选框radio...

    浅谈监听单选框radio改变事件(和layui中单选按钮改变事件),单选框radio 若是只引用jquery的话,监听单选按钮改变事件如下: 男 女 $(document).ready(functio ...

  4. Vue父组件传子组件数据中,Vue监听不到数据改变

    Vue父组件传子组件数据中,Vue监听不到数据改变 官方文档说明(引用来自官网) 检测变化的注意事项 由于 JavaScript 的限制,Vue 不能检测数组和对象的变化.尽管如此我们还是有一些办法来 ...

  5. JavaScript中字符串连接/拼接的四种方式

    JavaScript中连接字符串的方式有4种,分别是使用加号运算符连接.使用${}配合反引号连接.使用concat()函数连接.使用join()函数连接. 1. 使用加号运算符 示例代码如下: let ...

  6. Android dataBinding中使用include

    DataBinding下 使用include包括对象的传递,事件的监听. include的布局如下: custom_home.xml <layout xmlns:android="ht ...

  7. Android TabHost中切換、修改需要显示的Activity

    上個星期跟盛哥試了一段時間使用Fragment後還是不得其門而入(兩個人對Fragment都還不太熟悉),卡住的原因是現在有兩個Tab,當Tab1進入到第二個畫面,Tab2進到第三個畫面,但使用者切回 ...

  8. JavaScript中绑定事件监听函数的通用方法[ addEvent() ]

    上篇文章讲到了事件绑定的3中常用方法:传统绑定.W3C绑定方法.IE绑定方法.但是,在实际开发中对于我们来讲重要的是需要一个通用的.跨浏览器的绑定方法.如果我们在互联网上搜索一下会发现许多方法,一下是 ...

  9. adnroid string拼接_Android开发中string.xml文件中字符串的拼接

    第一种方法: 在string.xml中进行操作 MyStringDemo 我今年%1d岁了,上%s年级! 我今年%1$3d岁了,上%2$9s年级! 在代码中使用的地方只需要调用String类的form ...

最新文章

  1. 【洛谷P1508】吃吃吃
  2. sendmail configuration on HP-UX
  3. android怎么模拟返回,Android中障蔽返回键,HOME键以及模拟HOME键返回效果的方法...
  4. 【揭秘】12306是如何抗住几亿日活、百万级高并发的?
  5. [日推荐]『车价天天报』省钱买好车
  6. linux bind日志级别,BIND日志相关(一)
  7. vs code ipynb文件_UE4引擎 源码的获取、安装,以及VS配置
  8. 【20171005】Luogu P1164 小A点菜
  9. docker项目部署 php_使用Docker部署PHP开发环境的方法详解
  10. [转]Handsontable对单元格的操作
  11. ff14服务器延迟滑步,ff14滑步是什么意思
  12. 安装SQL SERVER2016或者2017时 安装程序无法与下载服务器联系 Microsoft R Server
  13. 【CocosCreator】单机游戏存档的常用加密解密方法
  14. [网络工程师]-IEEE 802.3定义的传输介质特性
  15. 有效降低BUCK纹波的方法(粘贴的)
  16. java 保存文件在服务器_Java中如何将数据保存到服务器端
  17. Linux 内核clk 硬件相关层
  18. C++在linux环境下获取毫秒、微妙级别时间
  19. PYTHON PLUS 原神——星辉兑换“宗室武器”的总体暴击率提升度算法
  20. 接手了屎一样的代码 怎么办?

热门文章

  1. 对自己狠一点-----胡言乱语
  2. [转]爱因斯坦·毕加索——空间、时间和动人心魄之美
  3. 电脑开机显示两个用户名怎么解决?
  4. 定了!阿里日成了“中国品牌日”! 老外说,原因都在这里了
  5. 5-20 打印九九口诀表 (15分)
  6. C#中{0}表示什么意思?
  7. 【毕业设计】flink大数据淘宝用户行为数据实时分析与可视化
  8. iOS真机不能运行,模拟器可以
  9. 户外蓝牙小音箱值得买
  10. 游戏服务器会遭到什么攻击,被攻击了怎么防御