通过研究databinding
,我创建了一个简单的活动来开始锻炼。
并有以下代码:
MainActivity:
class MainActivity : AppCompatActivity() {
val users = UserProfile("First Name","Last Name","Off",false)
val handlerbtn = HandlerButtonClick()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main)
binding.user = users
binding.handler = handlerbtn
}
}
点击类:
class HandlerButtonClick {
fun onClickButton(view: View, user: UserProfile) {
var msg = ""
if(!user.isOnline){
msg = "Online"
user.firstName = "Henrique"
user.lastName = "Mendes"
user.status = "Online"
user.isOnline = true
}else{
msg = "Offline"
user.firstName = "First Name"
user.lastName = "Last Name"
user.status = "Offline"
user.isOnline = false
}
Toast.makeText(view.context, msg, Toast.LENGTH_SHORT).show()
}
}
UserProfile类:
class UserProfile {
var firstName: String = ""
var lastName: String = ""
var status: String = ""
var isOnline: Boolean = false
constructor(firstNames: String, lastNames: String, statuss: String, isOnlines: Boolean) {
this.firstName = firstNames
this.lastName = lastNames
this.status = statuss
this.isOnline = isOnlines
}
}
XML:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.dev.bob.testdatabinding2.UserProfile" />
<variable
name="handler"
type="com.dev.bob.testdatabinding2.HandlerButtonClick" />
</data>
<LinearLayout 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"
android:orientation="vertical"
tools:context="com.dev.bob.testdatabinding2.MainActivity">
<View
android:layout_width="match_parent"
android:layout_height="1.0dp"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:background="@{user.isOnline?@color/colorGreen : @color/colorAccent}" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:text="@{user.firstName}" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:text="@{user.lastName}" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:text="@{user.status}" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{(view)-> handler.onClickButton(view, user)}"/>
</LinearLayout>
</layout>
toast工作正常,即变量msg
发生变化。但我在屏幕上的文字没有改变。我该怎么做才能让它们根据每个条件(If
/ else
)的内容进行更改?
我所说的是,点击按钮,firstName
不会改为亨利或名字(再次)
答案 0 :(得分:2)
它表现得很正确。来自document:
任何普通的旧Java对象(POJO)都可以用于数据绑定,但是 修改POJO不会导致UI更新。真正的力量 数据绑定可以通过赋予数据对象的能力来使用 数据更改时通知。有三种不同的数据更改通知机制,Observable对象,可观察字段和可观察集合。
或者您可以使用this快速而肮脏的方法尝试双向数据绑定:
在[{1}}之后,您的代码android:text
缺少=
。它应该是@:
。 android:text="@={user.firstName}"
表示“双向数据绑定”。 @={}
是单向数据绑定。
例如:
@{}
答案 1 :(得分:0)
您不能只为变量分配新值并观察UI上的更改。你应该以某种方式通知“DataBinding”。有几种方法可以做到。
第一个是使UserProfile扩展BaseObservable
并在某些属性发生变化时通知:
class UserProfile : BaseObservable {
@get:Bindable
var firstName: String = ""
set(value) {
notifyPropertyChanged(BR.firstName)
}
@get:Bindable
var lastName: String = ""
set(value) {
notifyPropertyChanged(BR.lastName)
}
... do same for other fields ...
constructor(firstNames: String, lastNames: String, statuss: String, isOnlines: Boolean) {
this.firstName = firstNames
this.lastName = lastNames
this.status = statuss
this.isOnline = isOnlines
}
}
第二个是在更改后将UserProfile
分配给ActivityMainBinding
:
class MainActivity : AppCompatActivity() {
val users = UserProfile("First Name","Last Name","Off",false)
lateinit var handlerbtn: HandlerButtonClick
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main)
binding.user = users
handlerbtn = HandlerButtonClick(binding)
binding.handler = handlerbtn
}
}
然后你应该改变HandlerButtonClick
class:
class HandlerButtonClick(val binding: ActivityMainBinding) {
fun onClickButton(view: View, user: UserProfile) {
var msg = ""
if(!user.isOnline){
//changes
}else{
//changes
}
binding.users = user
Toast.makeText(view.context, msg, Toast.LENGTH_SHORT).show()
}
}